前四题没什么问题,写到第五题突然卡住了。刚开始在想怎么搜,看了一下数据范围,好像可以暴力枚举,不过暴力枚举居然wa了,十分气愤。最后在大佬的帮助下发现是多此一举的多减了一块重叠部分的长度。以后写代码之前一定要先想好,在开始写。
poj 8470
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstdio> #include<string> #include<cmath> #include<string.h> using namespace std; int t,n; string s[15]; int ans[15]; string tmp[15]; int vis[15]; int m[15][15]; int l[15]; int len=0; int map[15]; int func(int n) { int ans=1; for(int i=1;i<=n;++i) ans*=i; return ans; } int getlen(int i,int j) { int cnt=1;int maxn=0; //cout<<l[i]<<' '<<l[j]<<endl; while(cnt<=min(l[i],l[j])){ //cout<<s[i].substr(l[i]-cnt,cnt)<<' '<<s[j].substr(0,cnt)<<endl; if(s[i].substr(l[i]-cnt,cnt)==s[j].substr(0,cnt))maxn=cnt;cnt++; } //if(i==1&&j==2)cout<<maxn<<endl; return maxn; } int main() { cin>>t; for(int i=1;i<=9;++i)map[i]=i; while(t--) { cin>>n; len=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=n;++i) { cin>>s[i]; } for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(i==j)continue; if(s[i].find(s[j])!=string::npos&&!vis[i]) { vis[j]=1; } } } //for(int i=0;i<10;++i)cout<<vis[i]<<endl; int ntmp=1; for(int i=1;i<=n;++i) { if(!vis[i]) { tmp[ntmp]=s[i];ntmp++; } } //cout<<len<<endl; n=ntmp-1; for(int i=1;i<=n;++i) { s[i]=tmp[i];l[i]=(int)s[i].size();len+=l[i]; } for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { if(i==j)continue; m[i][j]=getlen(i,j);//cout<<i<<' '<<j<<' '<<m[i][j]<<endl; } } int maxn=0; for(int i=0;i<func(n);++i) { int cnt=0; for(int j=1;j<=n-1;++j) { cnt+=m[map[j]][map[j+1]]; } if(maxn<cnt){ maxn=cnt; } //for(int i=1;i<=n;++i)cout<<map[i];cout<<endl; next_permutation(map+1, map+n+1); } //for(int i=1;i<=n;++i)cout<<ans[i]<<' ';cout<<endl; cout<<len-maxn<<endl; } return 0; }
第六题思路就是暴力搜索,典型的bfs。在选择用dfs还是bfs的时候要注意搜索深度一定的,比如生日蛋糕,用dfs;求最短blablabla的优先考虑bfs。
poj 8468
#include <iostream> #include <string.h> #include<cstring> #include <queue> using namespace std; #define INF 0x7fffffff string st,ed; int mi=INF; int l; int map[35][35]; int vis[35]; int cnt=1; queue<pair<int,int> > q; int flag=0; bool judge(string s1,string s2) { int n=0; for(int i=0;i<l;++i) { if(s1[i]!=s2[i])n++; } if(n==1)return 1; return 0; } string s[35]; void work() { q.push(make_pair(0,1));vis[0]=1; while(!q.empty()) { int k=q.front().first,p=q.front().second; if(map[k][cnt]) { mi=p;break; } q.pop(); //vis[k]=0; for(int i=0;i<cnt;++i) { if(map[k][i]&&i!=k&&!vis[i]) { q.push(make_pair(i,p+1)); vis[i]=1; } } } } int main() { cin>>st>>ed; l=st.size(); memset(vis,0,sizeof(vis)); while(cin>>s[cnt]) { cnt++; //if(cnt==6)break; } //cout<<cnt<<endl; s[0]=st;s[cnt]=ed; for(int i=0;i<=cnt;++i) { for(int j=0;j<=cnt;++j) { if(judge(s[i],s[j])) { map[i][j]=map[j][i]=1; //cout<<i<<' '<<j<<endl; } } } work(); if(mi<INF)cout<<mi+1; else cout<<"0"; return 0; }