poj 1699 Best Sequence
2014-06-02 21:26
351 查看
http://poj.org/problem?id=1699
题意:给你n个长度为L的序列,求包含这几个序列的最短长度。
先预处理每两个序列之间的关系,然后dfs枚举就行。
View Code
题意:给你n个长度为L的序列,求包含这几个序列的最短长度。
先预处理每两个序列之间的关系,然后dfs枚举就行。
#include <cstdio> #include <cstring> #include <algorithm> #define maxn 500 using namespace std; const int inf=1<<30; char str[maxn][maxn]; int c[maxn][maxn]; int n; bool vis[maxn]; int make_l(int s,int t) { int cnt=0; int k1=strlen(str[s]); int k2=strlen(str[t]); for(int i=0; i<=k1&&i<=k2; i++) { bool flag=false; for(int j=0; j<i; j++) { if(str[s][k1-i+j]!=str[t][j]) { flag=true; break; } } if(!flag) cnt=i; } return k1-cnt; } int dfs(int src,int step) { int sum=inf; if(step==n) { int kl=strlen(str[src]); return kl; } for(int i=1; i<=n; i++) { if(!vis[i]) { vis[i]=true; int sum1=c[src][i]; sum1+=dfs(i,step+1); vis[i]=false; sum=min(sum,sum1); } } return sum; } int main() { int t1; scanf("%d",&t1); while(t1--) { scanf("%d",&n); for(int i=1; i<=n; i++) { scanf("%s",str[i]); } memset(c,0,sizeof(c)); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { if(i==j) continue; c[i][j]=make_l(i,j); } } /*for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { printf("%d ",c[i][j]); } printf("\n"); }*/ memset(vis,false,sizeof(vis)); int ans=inf; for(int i=1; i<=n; i++) { vis[i]=true; ans=min(ans,dfs(i,1)); vis[i]=false; } printf("%d\n",ans); } return 0; }
View Code
相关文章推荐
- POJ 1699 Best Sequence (DFS+预处理)
- POJ 1699 Best Sequence
- 【POJ 1699】 Best Sequence(KMP+状压DP)
- poj 1699—Best Sequence(dfs剪枝)
- poj 1699 Best Sequence(AC自动机+状压DP)
- poj 1699 Best Sequence
- poj 1699 Best Sequence(AC自己主动机+如压力DP)
- Best Sequence(poj 1699) 状压dp(TSP)
- POJ1699--Best Sequence(预处理+暴力)
- poj 1699 Best Sequence
- POJ 1699 Best Sequence
- poj1699--Best Sequence(dfs+剪枝)
- POJ 1699 Best Sequence
- POJ 1699 Best Sequence (TSP之dp状态压缩+KMP计算主串前缀匹配子串后缀)
- POJ 1699 Best Sequence
- POJ 1699 Best Sequence
- poj 1699 Best Sequence (压缩dp)
- POJ1699 Best Sequence(AC自动机+状压DP)
- POJ 1699 Best Sequence (DFS+预处理)
- poj 1699 Best Sequence (搜索技巧 剪枝 dfs)