UVA 1625 "Color Length" (基础DP)】的更多相关文章

UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这次转移会给其他的元素带来的代价,也就是转移前已经出现但还没结束的元素都会代价+1   预处理每种颜色在两个序列中出现的位置bg[i][0/1]和ed[i][0/1], 计算f[i][j]时同时计算w[i][j]为(i,j)这个状态已经出现还没结束的个数 注意bg要先初始化为INF,计算w: if(b…
UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这次转移会给其他的元素带来的代价,也就是转移前已经出现但还没结束的元素都会代价+1   预处理每种颜色在两个序列中出现的位置bg[i][0/1]和ed[i][0/1], 计算f[i][j]时同时计算w[i][j]为(i,j)这个状态已经出现还没结束的个数 注意bg要先初始化为INF,计算w: if(b…
传送门 •参考资料 [1]:HopeForBetter •题意 •题解(by 紫书) •我的理解 用了一上午的时间,参考紫书+上述博文,终于解决了疑惑: 定义第一个颜色序列用串 s 表示,第二个用串 t 表示,下标均从 1 开始: 定义dp(i,j)表示串 s 的前 i 个字符与串 t 的前 j 个字符合并的最小值: ' ? ' 是加什么呢? 分析一下,当前的新序列包含哪些类型的字符: 1)当前新序列包含字符 ch 的开始和结束: 2)当前新序列只包含字符 ch 的开始,而不包含其结束: 3)当…
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4500 题意: 输入两个长度分别为n和m(n,m≤5000)的颜色序列,要求按顺序合并成同一个序列,即每次可以把一个序列开头的颜色放到新序列的尾部.对于每个颜色c来说,其跨度L(c)等于最大位置和最小位置之差.你的任务是找一种合并方式,使得所有L(c)的总和最小. 分析: 首先,因为…
题意:给定两个序列,让你组成一个新的序列,让两个相同字符的位置最大差之和最小.组成方式只能从一个序列前部拿出一个字符放到新序列中. 析:这个题状态表示和转移很容易想到,主要是在处理上面,dp[i][j] 表示从第一序列中拿了 i 个字符,从第二序列中拿了 j 个字符的最小和是多少,这个要提前预处理每个字符开始出现和最后出现的位置,然后再用一个c数组来记录已经有多少个字符出现,但没有结束.注意要清空. 代码如下: #pragma comment(linker, "/STACK:1024000000…
dp[i][j]表示前一个序列拿了i个颜色,后一个序列拿了j个颜色的最小花费. 转移的时候显然只能向dp[i+1][j],或dp[i][j+1]转移,每增加拿走一个颜色,之前已经出现但没结束的颜色个数的跨度都增加1,为了在转移的时候快速算出这个值,先预处理出每个颜色在各个序列中的起始和终止位置. memset (dp),然后就GG了 #include<bits/stdc++.h> using namespace std; #define FOR(i,s,e) for(int i = s; i…
思路还算明白,不过要落实到代码上还真敲不出来. 题意: 有两个由大写字母组成的颜色序列,将它们合并成一个序列:每次可以把其中一个序列开头的颜色放到新序列的尾部. 对于每种颜色,其跨度定义为合并后的序列中最后一次和第一次出现的位置之差,求所有合并方案中所有颜色跨度之和的最小值. 分析: d(i, j)表示两个串分别已经移走了i个和j个字符.那么无论新串的顺序是什么,有多少种颜色已经开始但尚未结束是确定的,记为c(i, j).再继续移走一个字符,所有颜色跨度之和就增加c(i, j).c的计算是通过记…
[PDF Link]题目点这里 这道题一眼就是动态规划,然而貌似并不好做. 如果不转换模型,状态是难以处理的. 巧妙地转化:不直接求一种字母头尾距离,而是拆开放到状态中. #include <iostream> #include <cstring> #include <cstdio> using namespace std; ; char s1[maxn],s2[maxn]; ],E1[],B2[],E2[]; int dp[maxn][maxn]; int add[m…
题意: 给出一个1*N的矩阵(就是一行的格子),其中部分格子可以有草,部分无草,现在要求放置一些稻草人在某些格子上,每个稻草人可以覆盖3个连续格子,为使得有草的格子都能被覆盖,问最少放置几个稻草人. 思路: 常规的DP.从左到右,考虑每个格子,无论是否有草,都可以放稻草人,也可以不放稻草人.然后进行各种转移就行了. #include <bits/stdc++.h> #include <iostream> #include <cstdio> #include <cs…
题意: 过河模型:有n个人要渡河,每个人渡河所耗时可能不同,只有1只船且只能2人/船,船速取决于速度慢的人.问最少耗时多少才能都渡完河? 思路: n<2的情况比较简单. 考虑n>2的情况,第一次肯定是两个耗时少的先过去.接下来有两种渡河方式,有可能是{a回,另外2人去,b回,a和b去},也可能是{a回,a和另一人去}.也就是说a和b的协作可以送走其他2个人,或者是a自己当船夫,送走另外一个人.这样子就有两种决策啦. 先将他们排个序(升序),然后a和b先过去.如果还有人没有过河,若left>…