bzoj1088: [SCOI2005]扫雷Mine(DP)
1088: [SCOI2005]扫雷Mine
题目:传送门
题解:
一道DP(玩过扫雷的资深玩家肯定一眼秒%%%)
其实定义一个F数组表示1~i的数目就OK。
前两个格子完全可以与处理出来,后面的for一次就搞定了
水了一题...
代码:
1 #include<cstdio> 2 #include<cstring> 3 #include<cstdlib> 4 #include<cmath> 5 #include<algorithm> 6 #define qread(x) x=read() 7 using namespace std; 8 inline int read() 9 { 10 int f=1,x=0;char ch; 11 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return f*x; 14 } 15 int a[11000]; 16 int f[11000],n; 17 int solve() 18 { 19 for(int i=2;i<n;i++) 20 { 21 int t=a[i]-f[i]-f[i-1]; 22 if(t<0 || t>1)return 0; 23 else f[i+1]=t; 24 } 25 if(f[n]+f[n-1]!=a[n])return 0; 26 return 1; 27 } 28 int main() 29 { 30 int ans=0; 31 memset(f,0,sizeof(f)); 32 qread(n); 33 for(int i=1;i<=n;i++)qread(a[i]); 34 if(a[1]>2){printf("0\n");return 0;} 35 if(a[n]>2){printf("0\n");return 0;} 36 if(a[1]==2) 37 { 38 f[1]=1;f[2]=1; 39 ans+=solve(); 40 } 41 if(a[1]==1) 42 { 43 memset(f,0,sizeof(f)); 44 f[1]=1; 45 ans+=solve(); 46 memset(f,0,sizeof(f)); 47 f[2]=1; 48 ans+=solve(); 49 } 50 if(a[1]==0) 51 memset(f,0,sizeof(f)),ans+=solve(); 52 printf("%d\n",ans); 53 return 0; 54 }