http://acm.hdu.edu.cn/showproblem.php?pid=2167
动态规划---状态压缩
#include <iostream> #include <string> #include <algorithm> using namespace std; int state2167[1600];//储存所有的状态,然后过滤后存储合法状态 int result2167[16][1600]={0};//储存N行在每种状态下的结果 int nline2167[16]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768}; int temparr2167[16]; int currentN=0,maxresult2167=0; typedef struct node2167{ node2167(int s) { state=s; next=NULL; } node2167() { state=0; next=NULL; } int state; struct node2167 *next; }Node2167; Node2167 Linktable2167[1600]; int max2167(int a,int b){ return a>b?a:b; } bool islegal2167(int i) { int end=-2,cur=-1; while(i) { cur++; if(i%2){ if(cur-end==1) return false; end=cur; } i/=2; } return true; } bool iscompare2167(int s1,int s2) { if( !((s1<<1)&s2) && !((s1>>1)&s2) && !(s1&s2) ) return true; return false; } void addnode2167(Node2167 &node,Node2167 *addnode) { Node2167 *temp=&node; while(temp->next!=0) temp=temp->next; temp->next=addnode; } void init2167() { for(int i=0;i<(1<<15);++i) { if(islegal2167(i)) state2167[currentN++]=i; } for(int i=0;i<currentN;++i) for(int j=i+1;j<currentN;++j) if(iscompare2167(state2167[i],state2167[j])) { addnode2167(Linktable2167[i],new Node2167(j)); addnode2167(Linktable2167[j],new Node2167(i)); } } int sumcurrentstate2167(int state,int n,int arr[16]) { int sum=0; for(int i=0;i<n;++i) { if(state&nline2167[i]) sum+=arr[i+1]; } return sum; } int main() { //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); init2167(); int num,i=1,temp=0; string line; while(getline(cin,line)) { num=count(line.begin(),line.end(),' '); temp=num; memset(temparr2167,0,sizeof(temparr2167)); int start=0,end=0,j=0; for(j=1;j<=num;++j) { end=line.find(' ',start); temparr2167[j]=atoi(line.substr(start,end).c_str()); start=end+1; } temparr2167[j]=atoi(line.substr(start,line.size()).c_str()); for(int k=0;k<currentN;++k) { if(state2167[k]>=(2<<num)) break; int tempmaxcurretn=0; for(Node2167 *p=Linktable2167[k].next;p!=0;p=p->next) { if(state2167[p->state]>=(2<<num)) continue; tempmaxcurretn=max2167(tempmaxcurretn,result2167[i-1][p->state]); } result2167[i][k]=tempmaxcurretn+sumcurrentstate2167(state2167[k],num+1,temparr2167); maxresult2167=max2167(maxresult2167,result2167[i][k]); } while(temp--) { ++i; getline(cin,line); memset(temparr2167,0,sizeof(temparr2167)); int start=0,end=0,j=0; for(j=1;j<=num;++j) { end=line.find(' ',start); temparr2167[j]=atoi(line.substr(start,end).c_str()); start=end+1; } temparr2167[j]=atoi(line.substr(start,line.size()).c_str()); for(int k=0;k<currentN;++k) { if(state2167[k]>=(2<<num)) break; int tempmaxcurretn=0; for(Node2167 *p=Linktable2167[k].next;p!=0;p=p->next) { if(state2167[p->state]>=(2<<num)) continue; tempmaxcurretn=max2167(tempmaxcurretn,result2167[i-1][p->state]); } result2167[i][k]=tempmaxcurretn+sumcurrentstate2167(state2167[k],num+1,temparr2167); maxresult2167=max2167(maxresult2167,result2167[i][k]); } } cout<<maxresult2167<<endl; memset(temparr2167,0,sizeof(temparr2167)); memset(result2167,0,sizeof(result2167)); i=1; maxresult2167=0; getline(cin,line); } return 0; }