hdu 2476 String Painter

第一道区间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