SCOI2005扫雷Mine(BZOJ1088,dp)
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1088
1088: [SCOI2005]扫雷Mine
Time Limit: 10 Sec Memory Limit: 162 MBDescription
相 信大家都玩过扫雷的游戏。那是在一个n*m的矩阵里面有一些雷,要你根据一些信息找出雷来。万圣节到了,“余”人国流行起了一种简单的扫雷游戏,这个游戏 规则和扫雷一样,如果某个格子没有雷,那么它里面的数字表示和它8连通的格子里面雷的数目。现在棋盘是n×2的,第一列里面某些格子是雷,而第二列没有 雷,如下图: 由于第一列的雷可能有多种方案满足第二列的数的限制,你的任务即根据第二列的信息确定第一列雷有多少种摆放方案。
Input
第一行为N,第二行有N个数,依次为第二列的格子中的数。(1<= N <= 10000)
Output
一个数,即第一列中雷的摆放方案数。
Sample Input
2
1 1
1 1
Sample Output
2
说好了不刷水题的。。。。仔细想想就会发现这题只与第一行有关。。枚举下就行。。也可以用状压dp的思想进行dp
codes:
1 #include<set> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #include<cstdlib> 6 #include<iostream> 7 #include<algorithm> 8 using namespace std; 9 #define For(i,n) for(int i=1;i<=n;i++) 10 #define Rep(i,l,r) for(int i=l;i<=r;i++) 11 12 int ans,n,tot[10010],Try[10010]; 13 14 void retry(){ 15 bool Flag = true; 16 Rep(i,3,n){ 17 Try[i] = tot[i-1] - Try[i-2] - Try[i-1]; 18 if(Try[i]<0){ 19 Flag = false; 20 break; 21 } 22 } 23 if(Flag&&(Try[n]+Try[n-1]==tot[n])) ans++; 24 } 25 26 int main(){ 27 scanf("%d",&n); 28 For(i,n) scanf("%d",&tot[i]); 29 Rep(i,0,tot[1]){ 30 Try[1] = i; 31 Try[2] = tot[1] - i; 32 retry(); 33 } 34 printf("%d\n",ans); 35 return 0; 36 }