题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4500

  题目描述: 两个字符串 ,组成一个新的字符串, 每次只能从其中一个的开头选一个加到新的尾, 问l(i)的最小值

  解题思路: dp(i, j)  表示从第一个字符串中取i 个, 第二个字符串中取j个时的最优方案, 我们创建数组c 表示从第一个字符串中取i 个, 第二个字符串中取j个时开始还没有结束的字符的数量, 这样状态转移方程就可以写成: dp(i,j) = min(dp(i-1,j)+c[i-1,j], dp(i, j-1)+c[i,j-1]) 我们每做一次状态转移就更新一次c数组

  代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <map>
#include <cstring>
#include <iterator>
#include <cmath>
#include <algorithm>
#include <stack>
#include <deque>
#include <map>#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
typedef long long LL;
using namespace std;
const int maxn = 5000+5;int dp[maxn][maxn];  // dp(i,j) p中取i个, q中取j个的最小代价
char p[maxn];
char q[maxn];
int c[maxn][maxn]; // c(i,j) p中取i个, q中取j个已经开始还没有结束字符的个数
int sp[30], sq[30], ep[30], eq[30];
const int INF = 0x3fffffff;int main() {int t;scanf( "%d", &t );while( t-- ) {
//        scanf( "%s", p+1);
//        scanf( "%s", q+1);scanf("%s%s", p + 1, q + 1);int n = (int)strlen(p+1);int m = (int)strlen(q+1);memset(c, 0, sizeof(c));memset(dp, 0, sizeof(dp));for( int i = 1; i <= n; i++ ) p[i] -= 65;for( int j = 1; j <= m; j++ ) q[j] -= 65;for( int i = 0; i < 26; i++ ) {sp[i] = sq[i] = INF;ep[i] = eq[i] = 0;}for( int i = 1; i <= n; i++ ) {sp[p[i]] = min( sp[p[i]], i );ep[p[i]] = i;}for( int i = 1; i <= m; i++ ) {sq[q[i]] = min( sq[q[i]], i );eq[q[i]] = i;}for( int i = 0; i <= n; i++ ) {for( int j = 0; j <= m; j++ ) {if( !i && !j ) continue;int v1, v2;v1 = v2 = INF;if( i ) v1 = dp[i-1][j] + c[i-1][j];if( j ) v2 = dp[i][j-1] + c[i][j-1];dp[i][j] = min( v1, v2 );if( i ) {c[i][j] = c[i-1][j];
//                    if( sp[p[i]] == i && (ep[p[i]] > i || eq[p[i]] > j ) ) c[i][j]++;
//                    if( ep[p[i]] == i && eq[p[i]] <= j ) c[i][j]--;if (sp[p[i]] == i && sq[p[i]] > j)  c[i][j]++;if (ep[p[i]] == i && eq[p[i]] <= j) c[i][j]--;}else if( j ) {c[i][j] = c[i][j-1];
//                    if( sq[q[j]] == j && (eq[q[j]] > j || ep[q[j]] > i ) ) c[i][j]++;
//                    if( eq[q[j]] == j && ep[q[j]] <= i ) c[i][j]--;if (sq[q[j]] == j && sp[q[j]] > i)  c[i][j]++;if (eq[q[j]] == j && ep[q[j]] <= i) c[i][j]--;}}}printf( "%d\n", dp[n][m] );}return 0;
}

View Code

  思考:状态转移时, 要注意和状态转移有关的变量有哪几个, 是否能够从原条件中预处理出来, 如果能够预处理出来就去做, 否则就换状态

转载于:https://www.cnblogs.com/FriskyPuppy/p/7323400.html

UVA 1625 Color Length DP相关推荐

  1. Uva 1625 - Color Length(DP)

    题目链接 https://cn.vjudge.net/problem/UVA-1625 [题意] 输入两个长度分别为n和m的颜色序列(n,m<=5000),要求按一定规则合并成一个序列,规则是每 ...

  2. UVA 1625—Color Length(ACM/ACPC Daejeon 2011)

    题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  3. UVa 1625 Color Length

    思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列 ...

  4. uva 1625——Color Length

    题意:给定两个长度分别为n和m 的颜色序列,要求按顺序合并成一个序列,即每次可以把开头的颜色放到新序列末尾,跨度l(c)等于最大和最小的位置之差. 思路:递推,f(i,j)表示s1移走了i个元素,s2 ...

  5. Uva 1626(区间dp)

    #include<iostream> #include<algorithm> #include<cstring> #include<string> us ...

  6. 【Uva 1625】Color Length

    [Link]: [Description] 给你两个序列,都由大写字母组成; 每次,把两个序列中的一个的开头字母加在字符串的尾端,然后在那个序列中删掉那个开头字母; 最后得到一个字符串; 这个字符串显 ...

  7. UVA 116 Unidirectional TSP DP

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&p ...

  8. UVA 1331 Minimax Triangulation DP, 三角剖分

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  9. uva 10453 - Make Palindrome(dp)

    题目链接:10453 - Make Palindrome 题目大意:给出一个字符串,通过插入字符使得原字符串变成一个回文串,要求插入的字符个数最小,并且输出最后生成的回文串. 解题思路:和uva 10 ...

最新文章

  1. 【Eclipse】推荐UML插件Green UML、AmaterasUML
  2. Android handler Thread 修改UI Demo
  3. 黄聪:C#编写的Word操作类,有换页,添加表格,文本功能
  4. android internet参数传递
  5. 测试必知的150个Linux命令
  6. Nginx搭建静态资源映射实现远程访问服务器上的图片资源
  7. Linux 技巧:让进程在后台可靠执行的几种方法
  8. 牛客网 -- 计算机历年考研复试上机题 -- 手机键盘
  9. 为啥非要用Python?Excel不香吗?
  10. mysql useunicode_jdbc连接mysql 为什么在连接时已经这样设置了 ?useUnicode=truecharacterEncodin...
  11. GDAL库中WFS服务中含有中文不能获取数据的问题
  12. numpy 中的nan和常用的统计方法
  13. 我的数据分析师转型之路,从零到阿里数据分析师
  14. 今日头条笔试8/23第二题
  15. xlsxwriter设置列宽_Python3之excel操作xlsxwriter模块
  16. 服务器删除东西直接找不到了,重新安装T1后,用了一天半,又出现演示版到期的问题了-重新删除T1PFLS服务后,怎么找不到服务器-esrv-Gh....exe文件?...
  17. discuz X2中template文件夹中模板文件目录
  18. java der格式_读取DER格式java中的私钥
  19. linux san网络,教你如何DIY SAN存储网络
  20. 教你配电脑:电脑小白如何选购笔记本电脑,笔记本性能知识,干货来了

热门文章

  1. Oracle 监听配置详解(转载)
  2. 虚拟机中在红帽的Linux 下安装yum工具
  3. PATH and LDFLAGS and CFLAGS
  4. A decorative fence(POJ1037)
  5. 物理DG主备库切换时遇到ORA-16139: media recovery required错误
  6. Hive Cilent数据操作
  7. 每日一句(2014-9-22)
  8. OSI七层与TCP/IP四/五层网络架构
  9. (五)JS基础知识二(通过图理解原型和原型链)【三座大山之一,必考!!!】
  10. android 获取sim卡,Android 获取手机SIM卡运营商