BZOJ1088: [SCOI2005]扫雷Mine
n<=10000,n*2的格子玩扫雷,给下面一行的数字,问上面一行有几种方案。
????我写的DP,貌似有更简洁的写法。。
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<stdlib.h> 5 //#include<iostream> 6 //#include<time.h> 7 using namespace std; 8 9 int n; 10 #define maxn 10011 11 int f[maxn][5][5],a[maxn]; 12 int main() 13 { 14 scanf("%d",&n); 15 int tmp=0; 16 for (int i=1;i<=n;i++) scanf("%d",&a[i]),tmp=max(tmp,a[i]); 17 if (tmp>=4) {puts("0");return 0;} 18 if (n==1) {if (a[1]==1) puts("1");else puts("0");return 0;} 19 f[1][a[2]][a[1]]=1; 20 if (a[2]>0 && a[1]>0) f[1][a[2]-1][a[1]-1]=1; 21 a[n+1]=3; 22 for (int i=2;i<=n;i++) 23 for (int j=0;j<=a[i];j++) 24 { 25 f[i][a[i+1]][j]=f[i-1][j][0]; 26 if (a[i+1]>0) f[i][a[i+1]-1][j]=f[i-1][j+1][1]; 27 } 28 // for (int i=1;i<=n;i++) 29 // for (int j=0;j<=4;j++) 30 // for (int k=0;k<=4;k++) 31 // cout<<i<<' '<<j<<' '<<k<<' '<<f[i][j][k]<<endl; 32 printf("%d\n",f[n][a[n+1]-1][0]+f[n][a[n+1]][0]); 33 return 0; 34 }