hdu 2476 String Painter

本文解析了一道复杂的区间DP题目,通过实例详细介绍了如何利用动态规划求解字符串转换问题。通过逐步更新状态转移方程,实现了从简单到复杂场景的递进解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一道区间dp题,感觉题意不是很好理解

题意:一次可以转换某一个位置的字符,或是一串连续的字符,举第一个例子zzzzzfzzzzz

1:aaaaaaaaaaa

2: abbbbbbbbba

3: abcccccccba

4: abcdddddcba

5: abcdeeedcba

6: abcdefedcba

于是第一个例子输出6,第二个同理

话不多说,直接贴一波代码

 1 #include<cstdio>  
 2 #include<iostream>  
 3 #include<algorithm>
 4 #include<math.h> 
 5 #include<string.h>  
 6 #include<vector> 
 7 #include<queue>
 8 #include<map>
 9 #include<iterator>
10 #include<vector>
11 #include<set>
12 #define INF 9999999
13 typedef long long ll;
14 const int Max=(1<<16)+10;
15 using namespace std;
16 
17 int dp[1005][1005];//dp[i][j]表示从i~j的刷法 
18 int ans[1005]; 
19 
20 int main()
21 {
22     string str1,str2;
23     int len;
24     while(cin>>str1>>str2)
25     {
26         len=str1.length();
27         for(int j=0;j<len;j++)
28         {
29             for(int i=j;i>=0;i--) 
30             {
31                 dp[i][j]=dp[i+1][j]+1;//逐个更新区间i~j内的值 
32                 for(int k=i+1;k<=j;k++)
33                 {
34                     if(str2[i]==str2[k])//若遇到相同的则需寻找区间的最小值 
35                         dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
36                 } 
37             }
38         }
39         
40         for(int i=0;i<len;i++)
41             ans[i]=dp[0][i];//ans[i]表示区间[0,i]需要刷的值 
42         for(int i=0;i<len;i++)
43         {
44             if(str1[i]==str2[i])//碰到相同的值选择不刷 
45                 ans[i]=ans[i-1];
46             else
47             {
48                 for(int j=0;j<i;j++)//寻找最优解 
49                     ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
50             }
51         }    
52         cout<<ans[len-1]<<endl;
53     }
54     return 0;
55 }

 

转载于:https://www.cnblogs.com/pter/p/5506787.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值