UVALive 4394 String painter ——(区间DP)

  其实这个dp过程有点似懂非懂。。。代码如下:

 1 #include <stdio.h>
 2 #include <algorithm>
 3 #include <string.h>
 4 using namespace std;
 5 const int N = 100 + 5;
 6 
 7 char a[N],b[N];
 8 int dp[N][N];
 9 int f[N];
10 
11 int main()
12 {
13     while(scanf("%s",a+1) == 1)
14     {
15         int n = strlen(a + 1);
16         scanf("%s",b+1);
17         for(int i=1;i<=n;i++) dp[i][i] = 1;
18         for(int len=2;len<=n;len++)
19         {
20             for(int i=1;i+len-1<=n;i++)
21             {
22                 int j = i + len - 1;
23                 dp[i][j] = dp[i+1][j] + (b[i] == b[i+1] ? 0 : 1);
24                 for(int k=i+1;k<=j;k++)
25                 {
26                     if(b[k] == b[i])
27                     dp[i][j] = min(dp[i][j], dp[i+1][k] + dp[k+1][j]);
28                 }
29             }
30         }
31         for(int i=1;i<=n;i++)
32         {
33             if(a[i] == b[i]) f[i] = f[i-1];
34             else
35             {
36                 f[i] = 2e9;
37                 for(int k=i;k>=1;k--)
38                 {
39                     f[i] = min(f[i], f[k-1] + dp[k][i]);
40                 }
41             }
42         }
43         printf("%d\n",f[n]);
44     }
45     return 0;
46 }

 

转载于:https://www.cnblogs.com/zzyDS/p/6567569.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值