poj1699
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj1699相关的知识,希望对你有一定的参考价值。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char data[11][101]; 5 int len[11]; 6 int addlen[11][11]; 7 int minnum; 8 int used[11]; 9 void add(int x,int y); 10 void dfs(int pre,int step,int sum,int num); 11 int main() 12 { 13 /*freopen("in.txt","r",stdin);*/ 14 int n,m; 15 cin >>n; 16 for(int i=0;i<n;i++) 17 { 18 minnum=10000; 19 cin >>m; 20 for(int j=0;j<m;j++) 21 { 22 cin >>data[j]; 23 len[j]=strlen(data[j]); 24 used[j]=0; 25 } 26 for(int j=0;j<m;j++) 27 for(int k=0;k<m;k++) 28 add(j,k); 29 for(int j=0;j<m;j++) 30 { 31 used[j]=1; 32 dfs(j,1,len[j],m); 33 used[j]=0; 34 } 35 cout <<minnum<<endl; 36 37 38 } 39 return 0; 40 } 41 void dfs(int pre,int step,int sum,int num) 42 { 43 if(sum>=minnum) return; 44 if(step==num) 45 { 46 if(sum<minnum) 47 minnum=sum; 48 return; 49 } 50 for(int i=0;i<num;i++) 51 { 52 if(used[i]==0) 53 { 54 used[i]=1; 55 dfs(i,step+1,sum+addlen[pre][i],num); 56 used[i]=0; 57 } 58 } 59 } 60 61 62 63 64 void add(int x,int y) 65 { 66 int length=0; 67 for(int i=1;i<=len[x]&&i<=len[y];i++) 68 { 69 bool flag=true; 70 for(int j=len[x]-i,k=0;k<i;k++,j++) 71 { 72 if(data[x][j]!=data[y][k]) 73 { 74 flag=false; 75 break; 76 } 77 } 78 if(flag) 79 length=i; 80 } 81 //cout <<length<<" "; 82 addlen[x][y]=len[y]-length; 83 }
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 char data[11][101]; 5 int len[11]; 6 int addlen[11][11]; 7 int minnum; 8 int used[11]; 9 void add(int x,int y); 10 void dfs(int pre,int step,int sum,int num); 11 int main() 12 { 13 /*freopen("in.txt","r",stdin);*/ 14 int n,m; 15 cin >>n; 16 for(int i=0;i<n;i++) 17 { 18 minnum=10000; 19 cin >>m; 20 for(int j=0;j<m;j++) 21 { 22 cin >>data[j]; 23 len[j]=strlen(data[j]); 24 used[j]=0; 25 } 26 for(int j=0;j<m;j++) 27 for(int k=0;k<m;k++) 28 add(j,k); 29 for(int j=0;j<m;j++) 30 { 31 used[j]=1; 32 dfs(j,1,len[j],m); 33 used[j]=0; 34 } 35 cout <<minnum<<endl; 36 37 38 } 39 return 0; 40 } 41 void dfs(int pre,int step,int sum,int num) 42 { 43 if(sum>=minnum) return; 44 if(step==num) 45 { 46 if(sum<minnum) 47 minnum=sum; 48 return; 49 } 50 for(int i=0;i<num;i++) 51 { 52 if(used[i]==0) 53 { 54 used[i]=1; 55 dfs(i,step+1,sum+addlen[pre][i],num); 56 used[i]=0; 57 } 58 } 59 } 60 61 62 63 64 void add(int x,int y) 65 { 66 int length=0; 67 for(int i=1;i<=len[x]&&i<=len[y];i++) 68 { 69 bool flag=true; 70 for(int j=len[x]-i,k=0;k<i;k++,j++) 71 { 72 if(data[x][j]!=data[y][k]) 73 { 74 flag=false; 75 break; 76 } 77 } 78 if(flag) 79 length=i; 80 } 81 //cout <<length<<" "; 82 addlen[x][y]=len[y]-length; 83 }
以上是关于poj1699的主要内容,如果未能解决你的问题,请参考以下文章
POJ1699 HDU 1560 Best Sequence(AC自动机 最短路)
BZOJ 1699 [Usaco2007 Jan]Balanced Lineup排队 线段树