Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
这个题有什么很变态的测试数据吗?老是过不了。附代码,希望大牛们帮忙,谢谢1#include <iostream> #include <cmath> using namespace std; int dp[60][60][102]; int len = 0,n,m,st[1024]; char map[110][15]; bool ok(int x) { if (x < 0 || x >= m) return false; return true; } int f(int x, int y, int n) //x为行n的炮状态,y为行n-1的炮状态 { if (dp[x][y][n] != -1) return dp[x][y][n]; int max = 0; int s = 0; for (int i = 0; i < m; ++i) if ((st[x]&(1<<i)) != 0) ++s; if (n == 1) { dp[x][y][n] = s; return s; } int temp = st[x]|st[y]; for (int i = 0; i < len; ++i) { bool b = true; int sum = 0; if ( (temp&st[i]) != 0) continue; for (int j = 0; j < m; ++j) { if (map[n-2][j] == 'H' && (st[i]&(1<<j)) != 0) { b = false; break; } } if (b) { int tt = f(y,i,n-1); max = max > tt ? max : tt; } } max += s; dp[x][y][n] = max; return max; } int main() { scanf("%d %d",&n,&m); int status = (int)pow(2.0,m); //此处是计算出有最多有多少种炮的放法 //处理每行的所有情况,用位处理,而后存储到st数组中 for (int i = 0; i < status; ++i) { bool b = false; for (int j = 0; j < m; ++j) { if ((i&(1<<j)) != 0) { if (ok(j-1) && (i&(1<<(j-1))) != 0) { b = true; break; } if (ok(j-2) && (i&(1<<(j-2))) != 0) { b = true; break; } if (ok(j+1) && (i&(1<<(j+1))) != 0) { b = true; break; } if (ok(j+2) && (i&(1<<(j+2))) != 0) { b = true; break; } } } if (!b) st[len++] = i; } //先初始化下map的第0行,全是山 for ( int i = 0; i < m; ++i ) { map[0][i] = 'H'; } //输入map for (int i = 1; i <= n; ++i) scanf("%s", map[i]); //初始化数组dp for ( int i = 0; i < 60; ++i ) { for ( int j = 0; j < 60; ++j ) { for ( int k = 0; k < 102; ++k ) { dp[i][j][k] = -1; } } } //dp int max = 0; for (int i = 0; i < len; ++i) for (int j = 0; j < len; ++j) { bool b = true; if ((st[i]&st[j]) != 0) continue; for (int k = 0; k < m; ++k) { if (map[n][k] == 'H' && (st[i]&(1<<k)) != 0) { b = false; break; } if (map[n-1][k] == 'H' && (st[j]&(1<<k)) != 0) { b = true; break; } } if (b) { int tt = f(i,j,n); max = max > tt ? max : tt; } } printf("%d\n",max); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator