[关闭]
@994495jj 2017-07-12T13:24:04.000000Z 字数 1956 阅读 837

Problem 1032 Pixel Picture(foj内网)(dp)

201707 (ACM)动态规划


题解

代码

  1. #include<cstdio>
  2. #include<string>
  3. #include<algorithm>
  4. #include<vector>
  5. #include<queue>
  6. #include<cmath>
  7. #include<iostream>
  8. #include<cstdlib>
  9. #include<cstring>
  10. using namespace std;
  11. typedef long long ll;
  12. #define rep(i,a,b) for(int i=(a);i<(b);++i)
  13. #define mp make_pair
  14. #define pb push_back
  15. #define fi first
  16. #define se second
  17. #define sz(a) (int)a.size()
  18. const int N=105;
  19. const ll mod=1e9+7;
  20. ll f[N][N][N][2][2];
  21. ll s[N][N][N][2][2];
  22. ll C[N][N];
  23. ll calc(int i,int x1,int y1,int x2,int y2,int t1,int t2) {
  24. return (s[i-1][x2][y2][t1][t2]+s[i-1][x1-1][y1-1][t1][t2]-s[i-1][x1-1][y2][t1][t2]-s[i-1][x2][y1-1][t1][t2])%mod;
  25. }
  26. void upd(ll &a, ll b){
  27. a+=b;
  28. a%=mod;
  29. }
  30. int main() {
  31. int n,m;
  32. while(~scanf("%d%d",&n,&m)) {
  33. ///init
  34. memset(f,0,sizeof(f));
  35. memset(s,0,sizeof(s));
  36. ///solve
  37. for(int i=1;i<=n;++i) {
  38. rep(l,1,m+1) {
  39. rep(r,l,m+1) {
  40. f[i][l][r][0][0]=(calc(i,l,l,r,r,0,0)+1)%mod;
  41. f[i][l][r][0][1]=(calc(i,l,r+1,r,m,0,0)+calc(i,l,r,r,m,0,1))%mod;
  42. f[i][l][r][1][0]=(calc(i,1,l,l-1,r,0,0)+calc(i,1,l,l,r,1,0))%mod;
  43. f[i][l][r][1][1]=(calc(i,1,r+1,l-1,m,0,0)+calc(i,1,r,l-1,m,0,1)+calc(i,1,r+1,l,m,1,0)+calc(i,1,r,l,m,1,1))%mod;
  44. }
  45. }
  46. rep(l,1,m+1) {
  47. rep(r,1,m+1) {
  48. rep(a,0,2) rep(b,0,2) s[i][l][r][a][b]=(s[i][l-1][r][a][b]+s[i][l][r-1][a][b]-s[i][l-1][r-1][a][b]+f[i][l][r][a][b])%mod;
  49. }
  50. }
  51. }
  52. ///print
  53. ll ans=0;
  54. rep(i,1,n+1) {
  55. rep(a,0,2) rep(b,0,2) upd(ans,s[i][m][m][a][b]);
  56. }
  57. ans=(ans+mod)%mod;
  58. cout<<ans<<endl;
  59. }
  60. return 0;
  61. }

Problem 1032 Pixel Picture
Accept: 4 Submit: 4
Time Limit: 5000 mSec Memory Limit : 131072 KB
Problem Description

小茗同学最近沉迷于像素画风的游戏中,他想尝试自己设计新的像素角色,他需要在一个n * m大小的画布上填充单元格。为了简化问题,背景色为白色,小茗同学填充色为黑色。

小茗同学也并没有想好新的角色长什么样,所以他想知道在n * m的画布上能画多少种图像出来。但是这样的数量太多了,小茗同学提出了两点限制:

  1. 图像必须是联通的,也就是任意两个黑色的单元格可以通过其他的黑色格子相互到达。

  2. 在坐标(x1, y1)的黑色单元格到(x2, y2)的黑色单元格的最短距离为|x1-x2|+|y1-y2|。

由于种类数太多,所以方案数对1000000007(1e9 + 7)取模。
Input

包含多组测试数据。

每组测试数据包含两个数n,m,表示图画大小1 <= n, m <= 100。
Output

每组测试数据输出一个数表示对应的方案数,对1000000007(1e9 + 7)取模。
Sample Input
2 2
3 4
Sample Output
13
571
Hint

2x2的方案:
10|01|00|00|11|00|10|01|11|11|10|01|11
00|00|10|01|00|11|10|01|10|01|11|11|11
Source
2017暑期选拔赛第一场

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注