知道什麼是1 ,什麼是0.
題意:求一個棋盤中最多可以放幾個十字(十字尺寸一定,寬度為一格)。
做法:壓縮一下就可以了,較水,只是,2了一下。。。。
#include<stdio.h>#include<string.h>int dp[105][65][65];int state[65],get[65],blo[105];int n,m,all,ret;inline int max(int a,int b){ return a>b?a:b;}void dfs(int lie,int s){ if(lie>=m) { for(int i=0;i<lie;i++) if(1<<i&s)get[all]++; state[all++]=s; return ; } dfs(lie+1,s); dfs(lie+3,s|1<<lie);//應該是加3!!!T_T}int main(){ int i,j,k,t,ans; char clo[15]; while(scanf("%d%d",&n,&m)!=EOF) { all=0; memset(blo,0,sizeof(blo)); memset(dp,-1,sizeof(dp)); memset(get,0,sizeof(get)); ret=-1; dfs(0,0); for(i=1;i<=n;i++) { scanf("%s",clo); for(j=0;j<m;j++) if(clo[j]=='H') blo[i]=blo[i]|1<<j; } for(i=0;i<all;i++) if((blo[1]&state[i])==0) dp[1][0][i]=get[i]; if(n>1) { for(i=2;i<=n;i++) for(j=0;j<all;j++) if((blo[i]&state[j])==0) for(k=0;k<all;k++) if((state[j]&state[k])==0) for(t=0;t<all;t++) if((state[t]&state[k])==0&&(state[t]&state[j])==0) dp[i][k][j]=max(dp[i][k][j],dp[i-1][t][k]+get[j]); } ans=0; for(i=0;i<all;i++) for(j=0;j<all;j++) ans=max(ans,dp[n][i][j]); printf("%d\n",ans); } return 0;}