标签:
| 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