Codeforces Round #272 (Div. 2) E. Dreamoon and Strings 动态规划

来源:互联网 发布:gta5pc女角色捏脸数据 编辑:程序博客网 时间:2024/06/14 09:36

http://codeforces.com/contest/476/problem/E
参考http://www.cnblogs.com/qscqesze/p/5794709.html

题意给你一个串S,和另外一个串P把k从0到|S|枚举,然后问你去掉k个字符后,s串里面最多有多少个不重叠的p字符串题解:dp,dp[i][j]表示考虑到第i个位置,去掉了j个字符的最大值然后我们对于每一个位置,先暴力找到最少去掉多少个,才能加一,然后暴力去转移这个玩意儿就好了

感悟:有点类似背包的感觉

#include<bits/stdc++.h>using namespace std;const int maxn = 2005;char s1[maxn],s2[maxn];int dp[maxn][maxn];int len1,len2;int solve(int x){    if(x<len2)return maxn;    int a=x,b=len2,tmp=0;    while(a&&b)    {        if(s1[a]==s2[b])a--,b--;        else tmp++,a--;    }    if(b==0)return tmp;    else return maxn;}int main(){    scanf("%s%s",s1+1,s2+1);    len1 = strlen(s1+1);    len2 = strlen(s2+1);    for(int i=0;i<=len1;i++)        for(int j=0;j<=len1;j++)            if(j>i)dp[i][j]=-3000;    for(int i=1;i<=len1;i++)    {        int x=solve(i);        for(int k=0;k<=len1;k++)            dp[i][k]=max(dp[i][k],dp[i-1][k]);        for(int k=0;k<=len1;k++)if(x<=k)            dp[i][k]=max(dp[i][k],dp[i-x-len2][k-x]+1);    }    for(int i=0;i<=len1;i++)        printf("%d ",dp[len1][i]);    printf("\n");}
阅读全文
0 0