poj 2817-WordStack解题报告
2012-05-16 23:10
281 查看
状态dp的一道比较简单的题,令dp[i][j]为第i个状态以第j个单词作为结尾所获得的最优解
View Code
View Code
#include<stdio.h> #include<string.h> #define N 11 char s ; int dp[1<<N] ; int mcs ; int n; int max(int a,int b) { return a>b?a:b; } void get_mc(int a,int b) { int len1=strlen(s[a]); int len2=strlen(s[b]); int i,j,k; int maxa=0; int res; for(i=0;i<len1;i++) { res=0; for(j=0;j<len2;j++) { if(i+j<len1&&s[a][i+j]==s[b][j]) res++; } maxa=max(maxa,res); } for(i=1;i<len2;i++) { res=0; for(j=0;j<len1;j++) { if(i+j<len2&&s[b][i+j]==s[a][j]) res++; } maxa=max(maxa,res); } mcs[a][b]=mcs[b][a]=maxa; } int fun(int state,int last) { int i; int statet=state; statet^=(1<<(last-1)); if(!statet) return 0; if(dp[state][last]!=-1) return dp[state][last]; int res; int maxa=0; for(i=0;i<n;i++) { res=0; if(statet&(1<<i)) res=fun(statet,i+1)+mcs[i+1][last]; maxa=max(maxa,res); } return dp[state][last]=maxa; } int main() { int i,j,p; while(scanf("%d",&n)&&n) { for(i=1;i<=n;i++) scanf("%s",s[i]); for(i=1;i<=n;i++) for(j=i+1;j<=n;j++) get_mc(i,j); memset(dp,-1,sizeof(dp)); p=(1<<n); int maxa=0; for(i=1;i<=n;i++) maxa=max(maxa,fun(p-1,i)); printf("%d\n",maxa); } return 0; }
相关文章推荐
- POJ 2817 WordStack (状态DP)
- POJ 2817 WordStack(状态压缩DP)
- POJ 1204-Word Puzzles解题报告
- POJ 2817 木棒 解题报告
- POJ 2817 WordStack(状态压缩DP)
- POJ-2251 Dungeon Master 解题报告
- [POJ 1000] A+B Problem 经典水题 C++解题报告 JAVA解题报告
- poj解题报告——2505
- POJ 1159 Palindrome解题报告
- POJ 1240 Pre-Post-erous! 解题报告
- POJ 2491 Scavenger Hunt 解题报告 再次利用map判重
- POJ 1088 滑雪——解题报告
- POJ 2744 子串 解题报告
- 解题报告之POJ1068—Parencodings
- POJ 1664 放苹果 解题报告
- POJ解题报告——1001 Exponentiation
- poj 3517 解题思路及报告
- POJ1094解题报告
- POJ - 3278 Catch That Cow解题报告
- poj1861解题报告