动态规划
文章平均质量分 59
Anonymous-邦
阿里巴巴家种芝麻的
展开
-
LIS问题(转换成LCS解法 O(n*n))
#include #include #include #include using namespace std; //转化成LCS问题,时间复杂度O(n*n) int d[105][105]; int a[105]; int b[105]; int c[105][105]; void LCS_path(int i,int j) //打印路径 { if(i==0||j==0) retu原创 2014-05-02 11:15:27 · 1302 阅读 · 0 评论 -
hdu5326 Work(树形dp)
题意:n个人,有n-1个关系,表示A管理B,求管理人数为K的人数。(间接上司也算上司) #include #include #include #include #include #include #include #include #include #include #define ll __int64 #define INF 0x3fffffff using namespace std; i原创 2015-08-29 10:54:59 · 731 阅读 · 0 评论 -
uva 10635 Prince and Princess(LCS问题转化成LIS问题O(nlogn))
最长公共子序列经典问题,由于题的条件特殊,可转换成LIS问题,可在O(nlogn)内得到解决。根据刘汝佳大大的,加上自己的理解,不太理解的童鞋可以看一看(前提:已掌握LIS问题和LCS问题的解法)原创 2014-05-03 19:52:07 · 1212 阅读 · 0 评论 -
hdu5317 RGCDQ(dp)
题意:F(x)表示数x质因子的个数,对于给定的区间(L,R),求maxGcd(F(i),F(j)) (l 思路:打表。2*3*5*7*11*13*17*19>MAXN,所以一个数最多只有7个质因子。 #include #include #include #define MAXN 1000010 using namespace std; int isp[MAXN]; int sum[MAXN]原创 2015-08-27 12:46:53 · 574 阅读 · 0 评论 -
hdu 1520 Anniversary party(树形DP)
本题可用树形DP求解(即在树上DP). father数组记录节点父亲,ch容器记录儿子。 dp[i][0]表示以节点i为跟的子树的最大总权值(不选点i),dp[i][1]表示选点i。#include #include #include #include #include #include #include #include #include #include #define ll __int6原创 2015-04-20 18:16:58 · 531 阅读 · 0 评论 -
Codeforces#297 B Pasha and Strini
题意:给一个字符串,交换m次,每次交换a[i]~n-a[i]+1的字符(例如a[i]=2,n-5,则s[2]和s[4]换)。 思路:暴力时间复杂度是10^5*10^5,pass。在交换中,我们可以先把多余的交换去掉。每个字符交换次数若为偶数,一定不变。为奇数,再交换一次即可。 用f[i]表示[i,n-i-1]段交换次数,n/2之后全部等价成1~n/2的。dp[i]表示每个字符交换的次数。注意字原创 2015-03-28 11:05:53 · 652 阅读 · 0 评论 -
HDU1003 Max Sum(最大连续子段和)
#include #include #include #include using namespace std; int main() { int T,n; int t=1; //freopen("d:\\test.txt","r",stdin); scanf("%d",&T); for(int k=1;k<=T;k++) { sc原创 2014-08-31 13:30:03 · 555 阅读 · 0 评论 -
POJ2229 Sumsets
d[i]表示数字i的方案数,分为两种情况: i位奇数时,d[i]=d[i-1],这个很容易想到。 i为奇数时,第一个数为1时,d[i]=d[i-1];第一个数为偶数时,d[i]=d[i/2].所以d[i]=d[i-1]+d[i/2] #include #include #include #include #include #include #include #include #include原创 2014-11-07 13:01:32 · 678 阅读 · 0 评论 -
HDU1024 Max Sum Plus Plus(DP)
状态:d(i,j)表示前j个数分为i段且包含第j个数时的最优结果,g(i,j)表示前j个数分为i段时的最优结果,g(m,n)即为所求结果。 本题数据较大,需采用滚动数组,注意:这题int类型就够用了,开long long可能会TLE。 用滚动数组后,g[j]表示分成i段时最优结果,最后求出的g[n]即为结果 #include #include #include #include #inclu原创 2014-11-10 20:37:18 · 740 阅读 · 0 评论 -
最优矩阵链乘
最优矩阵链乘(递推,递归,打印方案解法)原创 2014-05-07 23:10:53 · 2317 阅读 · 1 评论 -
最长单调递增子序列的三种解法
动规基础:最长递增子序列的三种解法。附详解和代码。第一种:转化成LCS问题求解O(n*n)。第二种:设d[i]为以第i个元素结尾的最长递增子序列的长度O(n*n)。第三种:二分查找优化O(nlogn)。原创 2014-05-04 21:20:10 · 8286 阅读 · 0 评论 -
完全背包问题(基本思路优化) O(n^2)
#include #include #include using namespace std; int f[26][30001]; int c[26]; int w[26]; int v[26]; int p[26]; int main() { int n,V,i,j,k; for(;;) { cin>>V>>n; memset(f,0,原创 2014-03-29 21:41:09 · 778 阅读 · 0 评论 -
动态规划入门详解(基本解题思路)
一.适用条件原创 2014-04-29 20:02:46 · 1728 阅读 · 0 评论 -
完全背包问题(基本思路解法)
//完全背包问题(01思路) #include #include #include using namespace std; int f[26][30001]; int c[26]; int w[26]; int main() { int n,v,i,j,k; for(;;) { cin>>v>>n; memset(f,0,sizeof(f原创 2014-03-29 21:17:29 · 1220 阅读 · 0 评论 -
hdu5328 Problem Killer(dp)
题意:给一个序列a,求最长的子串长度,子串必须是等差或者等比数列。 注意:不要开数组,不然会TLE。 #include #include #include #include #include #define ll __int64 using namespace std; int ap; int gp; int Max(int a,int b) { return a>b ?a原创 2015-09-06 09:11:47 · 493 阅读 · 0 评论