当前位置: 代码迷 >> 综合 >> HDU - 2476 String painter(区间DP)
  详细解决方案

HDU - 2476 String painter(区间DP)

热度:32   发布时间:2023-11-25 08:22:09.0

HDU - 2476 String painter

在这里插入图片描述

题目要求:将一串字符串A改成一串字符串B,每次修改只能修改一定区间内的,问最少几次能够完成。

给大家模拟一下第一组样例

0~10:变成a,aaaaaaaaaaa

1~9:变成b,babbbbbbbbba

2~8:变成c,abcccccccba

3~7:变成d,abcdddddcba

4~6:变成e,abcdeeedcab

5:变成f,abcdefedcab

一种需要6次,所以说应该用区间DP来解决此类问题

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;const int N = 110;
char a[N],b[N];
int s[N],dp[N][N];int main()
{
    while(scanf("%s%s",a,b)!=EOF){
    memset(dp,0,sizeof dp);int l=strlen(a);for(int i=0;i<l;i++) dp[i][i]=1;for(int len=1;len<l;len++)for(int i=0;i<l-len;i++){
    int j=i+len;dp[i][j]=dp[i+1][j]+1;for(int k=i+1;k<=j;k++)if(b[i]==b[k])dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);}for(int i=0;i<l;i++) s[i]=dp[0][i];for(int i=0;i<l;i++){
    if(a[i]==b[i]) s[i]=s[i-1];for(int j=0;j<i;j++) s[i]=min(s[i],s[j]+dp[j+1][i]);}printf("%d\n",s[l-1]);}return 0;
} 
  相关解决方案