标签:
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 6750 | Accepted: 3018 | Special Judge |
Description
Input
Output
Sample Input
die einkommen der landwirte sind fuer die abgeordneten ein buch mit sieben siegeln um dem abzuhelfen muessen dringend alle subventionsgesetze verbessert werden # die steuern auf vermoegen und einkommen sollten nach meinung der abgeordneten nachdruecklich erhoben werden dazu muessen die kontrollbefugnisse der finanzbehoerden dringend verbessert werden #
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden
思路:经典的dp问题,我用map把字符串数组映射成了int数组,然后递归打印解即可
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #include<map> map<string,int> all; char s[50]; int s1[110],s2[110]; int dp[110][110]; string ache[220]; int DP(int x,int y) { if(x<0||y<0) return 0; int &ans=dp[x][y]; if(dp[x][y]>=0) return ans; if(s1[x]==s2[y]) ans=DP(x-1,y-1)+1; else return ans=max(DP(x-1,y),DP(x,y-1)); return ans; } void print(int x,int y) { if(x<0||y<0) return ; if(s1[x]==s2[y]) { print(x-1,y-1); if(DP(x,y)==1) cout<<ache[s1[x]]; else cout<<' '<<ache[s1[x]]; } else { if(DP(x,y-1)>DP(x-1,y)) print(x,y-1); else print(x-1,y); } } void ini() { memset(dp,-1,sizeof(dp)); all.clear(); } int main() { while(~scanf("%s",s)) { ini(); if(s[0]=='#') continue; int top=0; int l1=0,l2=0; string t=s; if(all.count(t)==0) all[t]=++top,ache[top]=t; s1[l1++]=all[t]; while(scanf("%s",s)) { if(s[0]=='#') break; t=s; if(all.count(t)==0) all[t]=++top,ache[top]=t; s1[l1++]=all[t]; } while(scanf("%s",s)) { if(s[0]=='#') break; t=s; if(all.count(t)==0) all[t]=++top,ache[top]=t; s2[l2++]=all[t]; } dp[0][0]=(s1[0]==s2[0]); DP(l1-1,l2-1); print(l1-1,l2-1); puts(""); } return 0; }
标签:
原文地址:http://blog.csdn.net/kalilili/article/details/44861701