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

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

1:aaaaaaaaaaa

2: abbbbbbbbba

3: abcccccccba

4: abcdddddcba

5: abcdeeedcba

6: abcdefedcba

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

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

 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<vector>
#include<queue>
#include<map>
#include<iterator>
#include<vector>
#include<set>
#define INF 9999999
typedef long long ll;
const int Max=(<<)+;
using namespace std; int dp[][];//dp[i][j]表示从i~j的刷法
int ans[]; int main()
{
string str1,str2;
int len;
while(cin>>str1>>str2)
{
len=str1.length();
for(int j=;j<len;j++)
{
for(int i=j;i>=;i--)
{
dp[i][j]=dp[i+][j]+;//逐个更新区间i~j内的值
for(int k=i+;k<=j;k++)
{
if(str2[i]==str2[k])//若遇到相同的则需寻找区间的最小值
dp[i][j]=min(dp[i][j],dp[i+][k]+dp[k+][j]);
}
}
} for(int i=;i<len;i++)
ans[i]=dp[][i];//ans[i]表示区间[0,i]需要刷的值
for(int i=;i<len;i++)
{
if(str1[i]==str2[i])//碰到相同的值选择不刷
ans[i]=ans[i-];
else
{
for(int j=;j<i;j++)//寻找最优解
ans[i]=min(ans[i],ans[j]+dp[j+][i]);
}
}
cout<<ans[len-]<<endl;
}
return ;
}

最新文章

  1. 关于C#中readonly的一点小研究
  2. java.lang.ClassNotFoundException: org.apache.catalina.startup.VersionLoggerListener
  3. 字符串数组转为PHP级数组
  4. 选择什么样的DOCTYPE
  5. javascript function对象
  6. Java基础知识强化75:正则表达式之分割功能(字符串中的数字排序案例)
  7. Android 中 ListView Adapter getView 被多次调用问题 解决方法
  8. Oracle-11g 中两库间物化视图的同步
  9. 如何使用git 发布源码到CodePlex
  10. mongo安装,及远程连接
  11. Python 3 生成手写体数字数据集
  12. 使用exe4j工具制作简单的java应用程序
  13. spring之事务
  14. 使用SwitchToThisWindow时不切换问题
  15. Nginx 提示host not found in upstream 错误解决方法
  16. Vue实现用户自定义上传头像裁剪
  17. Net-Snmp工具(学习SNMP的工具,开源项目)简单使用
  18. USI和USCI的区别
  19. ZooKeeper分布式过程协同技术详解2——了解ZooKeeper
  20. learning ddr DLL-off mode

热门文章

  1. DP~数塔(hrbustoj1004)
  2. ubuntu安装android开发环境
  3. NSTimer用法,暂停,继续,初始化
  4. 一颗躁动的心---下决心从SLAM开始,不钻研嵌入式底层了
  5. 2016年10月31日--网页 Windows对象操作
  6. BZOJ 1051: [HAOI2006]受欢迎的牛
  7. ubuntu安装cacti错误
  8. hdu1520 树形dp Anniversary party
  9. python操作memcached以及分布式
  10. phpcms新闻详情页上一篇下一篇的实现