P2327 [SCOI2005]扫雷
首先只有一列下去
那肯定DP啦
然后想DP的时候发现
如果知道了第 1 个的状态
那么第 2 个的状态就可以从右边一列的第 1 个数推出来
然后知道了前面 2 个状态,第 3 个状态就可以从右边第 2 个数推出来
然后一直推下去
然后就全部出来了
根本就只有两种可能好吧!(第一个为雷 or 第一个不为雷)
然后分类讨论一下,看看有没有冲突就好了...
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int n,a[10007],f[10007],ans; bool flag; int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; //如果第一个不是雷 for(int i=1;i<=n;i++) { f[i+1]=a[i]-f[i]-f[i-1]; if(f[i+1]<0||f[i+1]>1)//判断冲突 { flag=1; break; } } if(!flag) ans++;//如果没冲突,答案+1 f[1]=1; flag=0;//如果第一个是雷 for(int i=1;i<=n+1;i++) { f[i+1]=a[i]-f[i]-f[i-1]; if(f[i+1]<0||f[i+1]>1)//判断冲突 { flag=1; break; } } if(!flag) ans++;//同上 cout<<ans; return 0; }
为什么洛谷的标签是DP...