炮兵陣地
Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 16003 Accepted: 6077
Description
司令部的將軍們打算在N*M的網格地圖上部署他們的炮兵部隊。一個N*M的地圖由N行M列組成,地圖的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下圖。在每一格平原地形上最多可以布置一支炮兵部隊(山地上不能夠部署炮兵部隊);
現在,將軍們規劃如何部署炮兵部隊,在防止誤傷的前提下(保證任何兩支炮兵部隊之間不能互相攻擊,即任何一支炮兵部隊都不在其他支炮兵部隊的攻擊范圍內),在整個地圖區域內最多能夠擺放多少我軍的炮兵部隊。
Input
第一行包含兩個由空格分割開的正整數,分別表示N和M;
接下來的N行,每一行含有連續的M個字符('P'或者'H'),中間沒有空格。按順序表示地圖中每一行的數據。N <= 100;M <= 10。
Output
僅一行,包含一個整數K,表示最多能擺放的炮兵部隊的數量。
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHPSample Output
6Source
Noi 01
dp[i][j][u] = Max+sum[i][j];
Max = max(Max,dp[i-1][u][v]); //不要忘了這個,因為這個錯了很多次
#include <iostream> #include <cstdio> #include <cstring> #define N 110 #define M 65 using namespace std; int dp[N][M][M],b[M],sum[N][M],n,m; char s1[M]; bool a[N][M],status[N][M]; int main() { //freopen("data.in","r",stdin); bool check(int k); int get_sum(int i,int j); while(scanf("%d %d",&n,&m)!=EOF) { memset(a,true,sizeof(a)); for(int i=1;i<=n;i++) { scanf("%s",s1); for(int j=1;j<=m;j++) { if(s1[j-1]=='H') { a[i][j] = false; } } } int Top=0; for(int i=0;i<(1<<m);i++) { bool k = check(i); if(k) { b[Top++] = i; } } memset(sum,0,sizeof(sum)); memset(status,true,sizeof(status)); for(int i=1;i<=n;i++) { for(int j=0;j<=Top-1;j++) { sum[i][j] = get_sum(i,j); } } memset(dp,0,sizeof(dp)); int res = 0; for(int i=0;i<=Top-1;i++) { if(!status[1][i]) { continue; } for(int j=0;j<=Top-1;j++) { if((b[i]&b[j])==0) { dp[1][i][j] = sum[1][i]; res = max(res,dp[1][i][j]); } } } for(int i=2;i<=n;i++) { for(int j=0;j<=Top-1;j++) { if(!status[i][j]) { continue; } for(int u=0;u<=Top-1;u++) { if(!status[i-1][u]||(b[j]&b[u])!=0) { continue; } int Max = 0; for(int v=0;v<=Top-1;v++) { if(!status[i-2][v]||(b[v]&b[u])!=0||(b[v]&b[j])!=0) { continue; } Max = max(Max,dp[i-1][u][v]); } dp[i][j][u] = Max+sum[i][j]; res = max(res,dp[i][j][u]); } } } printf("%d\n",res); } return 0; } bool check(int k) { int w[M]; memset(w,0,sizeof(w)); for(int i=1;i<=m;i++) { w[i] = k&1; k=k>>1; } for(int i=1;i<=m;) { if(w[i]==0) { i++; continue; } if(w[i]==1&&w[i+1]==0&&w[i+2]==0) { i+=2; }else { return false; } } return true; } int get_sum(int i,int j) { int k = b[j],s=0; bool check1=true;; for(int x=1;x<=m;x++) { int y = k&1; k=k>>1; if(y==1&&!a[i][x]) { check1 = false; break; }else if(y==1&&a[i][x]) { s++; } } if(!check1) { status[i][j] = false; s=0; } return s; } #include <iostream> #include <cstdio> #include <cstring> #define N 110 #define M 65 using namespace std; int dp[N][M][M],b[M],sum[N][M],n,m; char s1[M]; bool a[N][M],status[N][M]; int main() { //freopen("data.in","r",stdin); bool check(int k); int get_sum(int i,int j); while(scanf("%d %d",&n,&m)!=EOF) { memset(a,true,sizeof(a)); for(int i=1;i<=n;i++) { scanf("%s",s1); for(int j=1;j<=m;j++) { if(s1[j-1]=='H') { a[i][j] = false; } } } int Top=0; for(int i=0;i<(1<<m);i++) { bool k = check(i); if(k) { b[Top++] = i; } } memset(sum,0,sizeof(sum)); memset(status,true,sizeof(status)); for(int i=1;i<=n;i++) { for(int j=0;j<=Top-1;j++) { sum[i][j] = get_sum(i,j); } } memset(dp,0,sizeof(dp)); int res = 0; for(int i=0;i<=Top-1;i++) { if(!status[1][i]) { continue; } for(int j=0;j<=Top-1;j++) { if((b[i]&b[j])==0) { dp[1][i][j] = sum[1][i]; res = max(res,dp[1][i][j]); } } } for(int i=2;i<=n;i++) { for(int j=0;j<=Top-1;j++) { if(!status[i][j]) { continue; } for(int u=0;u<=Top-1;u++) { if(!status[i-1][u]||(b[j]&b[u])!=0) { continue; } int Max = 0; for(int v=0;v<=Top-1;v++) { if(!status[i-2][v]||(b[v]&b[u])!=0||(b[v]&b[j])!=0) { continue; } Max = max(Max,dp[i-1][u][v]); } dp[i][j][u] = Max+sum[i][j]; res = max(res,dp[i][j][u]); } } } printf("%d\n",res); } return 0; } bool check(int k) { int w[M]; memset(w,0,sizeof(w)); for(int i=1;i<=m;i++) { w[i] = k&1; k=k>>1; } for(int i=1;i<=m;) { if(w[i]==0) { i++; continue; } if(w[i]==1&&w[i+1]==0&&w[i+2]==0) { i+=2; }else { return false; } } return true; } int get_sum(int i,int j) { int k = b[j],s=0; bool check1=true;; for(int x=1;x<=m;x++) { int y = k&1; k=k>>1; if(y==1&&!a[i][x]) { check1 = false; break; }else if(y==1&&a[i][x]) { s++; } } if(!check1) { status[i][j] = false; s=0; } return s; }