zoukankan      html  css  js  c++  java
  • 区间DP HDU 2476

    两个字符串s1,s2

    从s1->s2

    最少刷几次

    刷 i->j 都变成一样的+1

     1 #include<stdio.h>
     2 #include<string.h>
     3 
     4 using namespace std;
     5 #define MAXN 110
     6 
     7 int dp[MAXN][MAXN];
     8 char s1[MAXN],s2[MAXN];
     9 int ans[MAXN];
    10 int min1(int a,int b)
    11 {
    12     return a>b?b:a;
    13 }
    14 int main()
    15 {
    16 
    17     while(scanf("%s%s",s1,s2)!=EOF)
    18     {
    19         memset(ans,0,sizeof(ans));
    20         memset(dp ,0,sizeof(dp));
    21         int n=strlen(s1);
    22         int len,i,j,k;
    23         for(i=0;i<n;i++)dp[i][i]=1; 刷n次  肯定是对的
    24 
    25         for(len=2;len<=n;len++) //由短到长
    26         {
    27             for(i=0;i<n-len+1;i++)
    28             {
    29                 j=i+len-1;  
    30                 dp[i][j]=dp[i+1][j]+1; //加一次  肯定是对的
    31                 for(k=i+1;k<=j;k++)
    32                 {
    33                     if(s2[i]==s2[k])
    34                         dp[i][j]=min1(dp[i][j],dp[i+1][k]+dp[k+1][j]);
    35                 }
    36             }
    37         }
    38         for(i=0;i<n;i++)
    39             ans[i]=dp[0][i];  //0->i刷几次
    40         for(i=0;i<n;i++)
    41         {
    42             if(s1[i]==s2[i])
    43             {
    44                 if(i==0)ans[i]=0;
    45                 else ans[i]=ans[i-1];
    46             }
    47             else
    48             {
    49                 for(j=0;j<i;j++)
    50                     ans[i]=min1(ans[i],ans[j]+dp[j+1][i]);
    51             }
    52         }
    53         printf("%d
    ",ans[n-1]);
    54 
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    手把手教您玩转信用卡 如何“以卡养卡”合法“套现”
    267家已获第三方许可机构名单查询
    C#生成图片验证码
    File I/O
    文件上传代码
    集合框架
    接口
    多态
    封装
    jsp做成mvc模式的代码
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6071138.html
Copyright © 2011-2022 走看看