码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 2476 区间dp

时间:2015-05-07 22:05:46      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:


题意是让你把第一个字符串变为第二个的最小步数,具体变法就不说了,

假设第一个和第二个串对应位置全都不一样,那就先不考虑串1了,dp【i】【j】i到j的最小步数;很显然开始dp【i】【j】=dp【i+1】【j】 我是从后往前跑的,如果中间处在相等比如str【i】=str【k】 则dp【i】【k】=dp【i+1】【k】  因为如果刷i到k-1要x步刷i+1到k要y步,现在str【i】==str【k】   如果第k个不和第i个一起刷  及先刷i再刷i+1到k-1 再刷k 则需要x+1步 其实如果i和k一起刷  则只需要x步   所有这里枚举i到j之间所有的这种可能 找到最小值即可,  最后考虑串1余循环2 有相等的情况    还是和前面一样的想法


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

#define INF 0x3f3f3f3f

char str1[110],str2[110];
int dp[110][110];
int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int i,j;
    while(~scanf("%s%s",str1,str2))
    {
        int len=strlen(str1);
        memset(dp,0,sizeof(dp));
        for(i=len-1;i>=0;i--)
        {
            dp[i][i]=1;
            for(j=i+1;j<len;j++)
            {
                dp[i][j]=dp[i+1][j]+1;
                for(int x=i+1;x<=j;x++)
                {
                    if(str2[i]==str2[x]) 
                    dp[i][j]=min(dp[i][j],dp[i+1][x]+dp[x+1][j]);
                }
            }
        }
        int dp1[110];
        for(i=0;i<len;i++)
        {
            dp1[i]=dp[0][i];
            if(str1[i]==str2[i])
            {
                if(i==0) dp1[i]=0;
                else
                {
                    dp1[i]=dp1[i-1];
                }
            }
            else
            {
                for(j=0;j<i;j++)
                dp1[i]=min(dp1[i],dp1[j]+dp[j+1][i]);
            }
        }
        printf("%d\n",dp1[len-1]);
    }
    return 0;
}

hdu 2476 区间dp

标签:

原文地址:http://blog.csdn.net/zxf654073270/article/details/45567075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!