poj 1185
狀態壓縮,看了周偉的動態規劃之狀態壓縮,講解的很詳細,從寫程序,到ac花了7個小時,3個小時敲代碼,并理思路,4個小時調錯,最后發現還是粗心問題,算法上病沒有錯誤,不能在等啦,以后wa后,先仔細把代碼看一遍,要有耐心呢,不能過度依賴調試,可能后者會浪費更多的時間
#include <iostream> #include <cstdio> #include <string.h> #define max(a,b) ((a)>(b)?(a):(b)) using namespace std; char g[100+10][10+10]; int c[65]; int f[100+10][65][65]; int s[65]; int cm[100+10]; int n,m; int main() {while(~scanf("%d%d",&n,&m)){getchar();int i,j,k,p;memset(cm,0,sizeof(cm));memset(f,0,sizeof(f));for(i=0;i<n;i++){for(j=0;j<m;j++){scanf("%c",&g[i][j]);if(g[i][j]=='P') cm[i+1]|=(1<<j);}getchar();}int tot=0,t,tem,d,amount;for(i=0;i<(1<<m);i++){tem=-3;amount=0;for(j=0;j<m;j++){t=i&(1<<j);if(t){if((j-tem)<=2) break;amount++;tem=j;}}if(j==m){s[tot]=i;c[tot++]=amount;}}for(i=0;i<tot;i++){for(j=0;j<tot;j++)if((cm[1]&s[i])==s[i]) f[1][i][j]=c[i];}cm[0]=0;for(i=2;i<=n;i++){for(j=tot-1;j>=0;j--){if((cm[i]&s[j])==s[j]){for(k=tot-1;k>=0;k--){if((cm[i-1]&s[k])==s[k]&&!(s[j]&s[k])){for(p=tot-1;p>=0;p--){if(!(i-2)||(cm[i-2]&s[p])==s[p]&&!(s[k]&s[p])&&!(s[j]&s[p])){f[i][j][k]=max(f[i-1][k][p]+c[j],f[i][j][k]);}}}}}}}int maxv=-1;for(i=0;i<tot;i++){for(j=0;j<tot;j++){if(!(s[i]&s[j])) maxv=max(maxv,f[n][i][j]);}}printf("%d\n",maxv);}return 0; }轉載于:https://www.cnblogs.com/lj030/archive/2013/03/28/3002211.html
總結
- 上一篇: MyEclipse配置DataBase
- 下一篇: [解决]Win7+Tomcat5.5 只