动态规划
文章平均质量分 53
WildKid1024
骐骥一跃,不能十步。驽马十驾,功在不舍!
展开
-
UVA 473——Raucous Rockers
题意:给定n个数,放到m个容器里,每个容器的容量是t(n个数的累加和不超过t),在不打乱放的顺序的情况下问最多能放多少个数?思路:多维dp,f[i][j[k]表示前i个数放到第j个容器放k个的最大数量。则不放的状态为f[i-1][j][k],放为f[i-1][j-1][k](放在第一个)f[i-1][j-1][k-v[i]]+1(不是放在第一个)。code:#inclu原创 2016-03-31 21:22:34 · 405 阅读 · 0 评论 -
uva 10534——Wavio Sequence
题意:给定一个序列,求一个最长的序列,使得他的前半部分是递增的,而后半部分是递减的,且两部分的长度一样。思路:经典的LIS问题,和openjudge登山问题一样,前后各扫一遍,找到前置和倒置的LIS,然后遍历一遍找到最大的ansjicode:原创 2016-03-25 20:25:55 · 769 阅读 · 0 评论 -
UVA 11584—— Partitioning by Palindromes
题意:给定一个串,然后问最少可以分割成多少个回文串。思路:简单dp,dp[i]=min(dp[j]+1,1code:#include using namespace std;const int N=1005;char s[N];int dp[N];bool ok(int l,int r){ while (r>l){ if (s[原创 2016-03-25 21:27:33 · 327 阅读 · 0 评论 -
UVA 10635——Prince and Princess
题意:给定两个长度为p+1和q+1的序列,求两个序列的LCS。思路:如果直接使用朴素的LCS算法则O(pq)会超时,可以把A中出现的元素编码,然后映射到B(只保留AB都存在的元素),这样就转化为求B的LIS问题了O(nlogn)。code:#include using namespace std;const int N=250*250;const int I原创 2016-03-25 21:49:49 · 401 阅读 · 0 评论 -
UVA 10891——Game of Sum
题意:给定一个长度为n的序列,两个人分别从两端开始取若干数,但是规定要么左,要么右,问双方都采取最优策略下A的总和减去B的值。思路:区间dp,dp(i,j)表示先手的总和,那么状态转移方程便为dp(i,j)=sum(i,j)-min(左边取,右边取,0(取完)),记忆化搜索。code:#include #include #include #include usi原创 2016-03-25 22:11:15 · 360 阅读 · 0 评论 -
UVA 10453—— Make Palindrome
题意:给定一个字符串,求添加最少的字母使得该串是回文串。思路:区间dp+记忆化搜索。dp[i][j]为区间的最小添加数,那么dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;相等时则为dp[i+1][j-1];code:#include using namespace std;const int INF=0x3f3f3f3f;const原创 2016-03-27 20:35:00 · 465 阅读 · 0 评论 -
UVA 11552——Fewest Flops
题意:给定一个长为s的字符串(其中s为k的倍数),然后按照前后分成s/k 组,每组之内可以重排,使得重排后的块数最少(一段连续的字母算是一块)。思路:区间dp,dp[i][fa]表示前i组且第i+1组的最左边的字符是fa+'a'的状态能得到的最少的块数,那么状态转移也就是枚举两边应该放什么字符。code:#include using namespace std;c原创 2016-03-28 21:29:15 · 425 阅读 · 2 评论 -
uva 10254——The Priest Mathematician
题意:汉诺塔题目的变形,有4根柱子,可以把顶部的k个盘子移到最后的柱子上,然后按照汉诺塔,问最后走的最小步数。思路:递推,经过递推可以发现f[n] = f[k]*2+g[n-k],其中f[n]为4个柱子时的最小步数,g[n]为3根柱子的最小步数。要用java大数来解决。code:import java.math.*;import java.util.Scanner;原创 2016-03-28 21:37:27 · 741 阅读 · 0 评论 -
uva 10163——Storage Keepers
题意:给定n个相同的仓库,有m个人轮流值守,第i个人的应聘者的能力为pi,如果应聘者看守k个仓库,则仓库安全指数为pi/k的整数部分,求使得所有最小安全系数最大且工人pi最小的设计。思路:二分+01背包。01背包找到x安全系数下是否能守住n个仓库,不断的二分k,找出最小安全系数最大的值,01背包维护最小的工资。code:#include using namespace原创 2015-12-13 20:16:13 · 585 阅读 · 0 评论