DP
文章平均质量分 71
角落里的阳光Lee
这个作者很懒,什么都没留下…
展开
-
hdu 4632 Palindrome subsequence 多校第四场
题意:一个字符串,有多少个子串是回文串。用dp[i][j]表示这一段里有多少个回文串,那首先dp[i][j]=dp[i+1][j]+dp[i][j-1],但是dp[i+1][j]和dp[i][j-1]可能有公共部分,所以要减去dp[i+1][j-1]。如果s[i]==s[j]的话,还要加上dp[i+1][j-1]+1。#include #i原创 2013-08-01 19:06:38 · 899 阅读 · 0 评论 -
hdu 4669 Mutiples on a circle 多校第七场
先求a[n-1]和a[0]不连接的 用dp可以求 dp[i][j]表示第i为余数为j 这里用了滚动数组。。再处理a[n-1]和a[0]相连的 枚举终点 然后将前缀(en[i]表示的就是i~n-1这个前缀的余数)整个的搬到后缀中 通过余数拼接统计 #include #include #include using namespace std;#define clr(a原创 2013-08-14 10:41:54 · 647 阅读 · 0 评论 -
UVA 10564 Paths through the Hourglass
一个由格子组成的沙漏,输出从上往下的路径中 和为s 的方案数,如果路径数大于0,输出起点编号最小对路径中字典序最小对方案。从底下直接一遍DP上来,中间分成两段,状态转移方程稍微有点不一样,设d[ i ][ j ][ k ] 表示从最后一行往上到i行j列得到值为k的数量,路径的话 从上往下枚举,如果L可行 输出L,否则输出R 这样一层层下去就行。#inclu原创 2013-08-11 14:48:04 · 580 阅读 · 0 评论 -
UVALive 2031 Dance Dance Revolution
简单dp。。。 dp[s][l][r] l表示左脚所在位置,r表示右脚所在位置 的 最小消耗。。#include #include #include #include #include #include using namespace std;#define clr(a,b) memset((a),b,sizeof(a))const int ma原创 2013-08-11 20:17:16 · 514 阅读 · 0 评论 -
UVALive 3530 Martian Mining
一个n*m的矩形,每个点有两种矿,A矿往W方向,B矿往N方向,每个格子上建两种运送带,一种方向是w的,一种是n的,要求一个格子最多只能有一种带,而且传送带不能断,之后能运到边界才算有效,而且不能曲折,求收集到的A,B总量最大设dp[ i ][ j ] 为前i行,前j列的最大和,每个格子只可能有一种方向的传送带,要么横,要么竖,那么dp[i][j]=max(dp[i-1][j]+sumr[i原创 2013-08-10 18:32:15 · 688 阅读 · 0 评论 -
UVA 10534 Wavio Sequence
题意:给你一个序列,求一个最长波浪子序列(不一定连续),满足长度为奇数2k+1 它满足前k+1个是严格递增的,后k+1是严格递减的,即相邻两个数不能相同,输出最大长度。 可以转化为经典的LIS问题,预先用O(nlogn)处理出dp1[ i ],dp2[ i ] ,dp1[ i ] 为以第i个数尾的最长递增序列长度,dp2[ i ] 为以i为开头,到n的最长递减序列长度那么ans = max原创 2013-08-03 17:14:37 · 676 阅读 · 0 评论 -
uva 10859 Placing Lampposts 树形dp
#include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for (int i = 0; i < (int)(n); i++)#def原创 2013-08-02 16:41:17 · 614 阅读 · 0 评论 -
UVA 1099 Sharing Chocolate
#include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for (int i = 0; i < (int)(n); i++)#def原创 2013-08-03 12:16:23 · 1032 阅读 · 0 评论 -
UVA 1169 Robotruck
dp[i] 表示从原点出发,将前i个垃圾处理的最小距离dis[i] 表示从原点一直到第i个的总距离 所以 dis[i]-dis[j+1] 表示从第就j+1 到 i 的距离 odis[i] 表示第i个到原点的距离,w[i] 表示前i个的质量之和 dp[i]= min(dp[j]+odis[j+1]+dis[i]-dis[j+1]+odis[i] ) j令cal( j原创 2013-08-03 12:39:23 · 839 阅读 · 0 评论 -
uva 11552 Fewest Flops
题目大意:给你一个字符串,要你按每组k个按照顺序进行分组,每组里的字母顺序任意,然后再按照组的顺序拼起来,如果相邻的几个相同的字母算一个块,拼起来后,最少的块是多少?所以要最小每组相同字母肯定在一起,所以每组枚举结尾字母即可,dp[i][j] 表示 第i组 字母j 结尾 的最小值如果第i组结尾和第i-1组结尾字母相同 如果 i组的 size==1 则 相等 否则 dp原创 2013-08-03 16:38:06 · 645 阅读 · 0 评论 -
uva 11584 Partitioning by Palindromes dp入门题
dp[i]表示前i个最少构成几个回文所以转移方程为 如果(j-i)是一个回文 则 dp[i]=min(dp[i],dp[j-1]+1) (j#include #include #include #include #include #include #include #include using namespace std;#define原创 2013-08-03 16:54:54 · 736 阅读 · 0 评论 -
UVA 1424 Salesmen dp入门题
题目大意:给你一个无向联通图,在给你一个序列,要求你把它转换成另一个序列,该序列相邻两点的值要么图上是联通的,要么是相同的,要求修改的点数最小。 设dp[ i ][ j ] 表示从1到第i个位置,以数字 j 为结尾的最小修改点数,那么状态转移方程为:if(j==a[i]) dp[i][j]=min(dp[i][j],dp[i-1][k]); else dp[i][j]原创 2013-08-03 17:02:41 · 923 阅读 · 0 评论 -
poj 3809 UVaLive 4643 Twenty Questions
#include #include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for (int i = 0; i < (int)(n);原创 2013-08-03 20:35:52 · 1003 阅读 · 0 评论 -
UVA 11404 Palindromic Subsequence
逆序后求LCS,然后找出i+j == len情况的最长最小的LCS(子序列在1~i中出现,且其逆序列在i+1到len中出现,对应于回文串偶数情况), (i+j == len-1情况的最长最小的LCS+str[i+1])(子序列在1~i 中出现,且其逆序在i+2到len中出现,注意其中包括子序列为空的情况,即回文串中只有一个字符,对应于回文串奇数情况),从这俩种情况中找出最优解#incl原创 2013-08-08 10:29:37 · 550 阅读 · 0 评论 -
UVALive 4731 Cellular Network
把n个数分成w组,每个组的值为这个组加上前面所有组的数字个数之和*这个组的概率之和,要使所有的这些组的和最小。因为每个组的概率之和前面要乘系数,而且是越早选越小,那么我们把所有数字按照从大到小排序,但由于一个组加进去数字如果过多,它前面的系数也会变大,使前面那些大数去乘一个比较大的系数,这里就需要DP一下。设dp[ i ][ j ] 表示前i个数分成j个组能获得的最小值,状态转移方原创 2013-08-09 15:49:21 · 870 阅读 · 0 评论 -
UVA 10635 Prince and Princess
一开始用滚动数组写了个N^2 的LCS 果断TLE了。由于每个序列的元素都是互不相同的,所以将A序列重新编号,1-p,然后根据这个编号,对B也重新编号,那么实际上A和B的LCS问题就转化为求B的LIS,复杂度是O(NlogN)#include #include #include #include #include #include #in原创 2013-08-09 16:01:48 · 493 阅读 · 0 评论 -
UVALive 3882 And Then There Was One
经典约瑟夫环问题,n个数排成一圈,第一次删m,以后每k个数删一次,求最后留下的数。为了处理方便,我们约定n个人的编号为0~n-1,最后答案+1就好,先不考虑m,设f[ n ]为这n个人最后留下的编号,那么f[ n ] =( f[ n-1 ] + k)%n+,f[ 1 ] = 0。根据这个递推式,一直推到n-1,第一个数我们是删m,因此答案 f[ n ] = (f[ n-1 ] + m)%n原创 2013-08-09 16:09:21 · 699 阅读 · 0 评论 -
UVA 1351 UVALive 3363 String Compression
dp[i][j] 表示 i-j这一段的最小值,那么转移方程 dp[i][j] = min(dp[i][i+k]+dp[i+k+1][ j] ,(如果是i--i+k-1 这个子串的重复)min( dp[i][i+k-1] + flag+2 ) )#include #include #include #inclu原创 2013-08-06 20:54:15 · 684 阅读 · 0 评论 -
hdu 4681 String 多校第八场
分别枚举 A 和B 包含C 的起始和结束位置相当于 C分别把A和B 分成俩部分,枚举C在A,B的位置,ans=max(前部最长公共长度+C长度+后部最长公共长度)#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include using names原创 2013-08-16 20:01:35 · 500 阅读 · 0 评论