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
",f[n][a[n+1]-1][0]+f[n][a[n+1]][0]);
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/Blue233333/p/7986372.html