![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 68
nw4869
i m just a kid
展开
-
01背包与完全背包微妙的区别
01背包跟完全背包微妙的区别://完全背包void solve1(){ memset(d, 0, sizeof(d)); for(int i = 0; i < N; i++) for(int j = 0; j <= W; j++) if(j < w[i]) d[i+1][j] = d[i][j]; else d[i+1][j] = max(d[原创 2014-03-02 14:04:07 · 1417 阅读 · 0 评论 -
UVA - 10066 - The Twin Towers (动态规划, LCS)
点击打开链接题意:给出两个塔的石头半径的序列,求最长雙子星塔的高度。即:给出两个序列,求最长公共子序列。#include #include #include using namespace std;const int MAX_N = 101, MAX_M = 11, INF = 0x3f3f3f3f;int N1, N2;int a[MAX_N], b[MAX_N], d[MA原创 2014-03-10 08:53:59 · 852 阅读 · 0 评论 -
UVA - 147 - Dollars(动态规划)
点击打开链接多种面额硬币组合问题,类似于此题:UVA - 674 - Coin Change(动态规划)。WA了一次,百思不得其解,原来是浮点数精度问题:用int mm = 100*money;输入285.65可能mm = 284改成int mm = 100*money+0.5;则可以确保mm = 285#include #include #include原创 2014-03-10 10:01:41 · 875 阅读 · 0 评论 -
UVA - 357 - Let Me Count The Ways(动态规划)
点击打开链接多种面额硬币组合问题,类似于此题:UVA - 674 - Coin Change(动态规划)。d[]要用long long#include #include #include using namespace std;const int MAX_N = 301*100, MAX_M = 11, INF = 0x3f3f3f3f;int N;long原创 2014-03-10 10:17:09 · 727 阅读 · 0 评论 -
POJ 1050 To the Max(动态规划、最大子矩阵和)
//poj 1050 - dp//2014-6-11#include #include #include using namespace std;const int MAX_N = 111;int n;int a[MAX_N][MAX_N];//int d[MAX_N][MAX_N][MAX_N];int inline getMax ( int a, int b, int c原创 2014-06-11 13:36:01 · 766 阅读 · 0 评论 -
POJ 1088 - 滑雪(动态规划)
点击打开链接// poj 1088// [6/11/2014 wind]#include #include #include using namespace std;const int MAX_RC = 100;int row, cow;int a[MAX_RC][MAX_RC];int d[MAX_RC][MAX_RC];int dx[] = { -1, 1原创 2014-06-11 21:22:30 · 561 阅读 · 0 评论 -
POJ 1157 - LITTLE SHOP OF FLOWERS (动态规划)
点击打开链接W// poj 1157 (IOI 1999 - dp)// [6/13/2014 wind]#include #include using namespace std;int const MAX_N = 101, INF = 0x3f3f3f3f;int f, v;int a[MAX_N][MAX_N];int d[MAX_N][MAX_N];原创 2014-06-13 15:59:39 · 682 阅读 · 0 评论 -
最长不下降子序列(动态规划:LIS)
d[i] = int LIS(int a[], int n){ int d[1000]; memset(d, 0, sizeof(d)); for(int i = 0; i < n; i++) { d[i] = 1; for(int j = 0; j < i; j++) { if(a[i] >= a[j] && d[j]+1 > d[i]) {原创 2014-06-14 21:25:22 · 886 阅读 · 0 评论 -
UVA - 10131 - Is Bigger Smarter? (动态规划,LIS)
点击打开链接给出一系列大象的体重和智商,求在体重升序的排序中找出智商的最大下降序列,并输出序列。先排序,再用LCS的动规。WA了一次,因为输出路径的时候出了点问题。#include #include #include #include using namespace std;const int MAX_N = 1001, MAX_W = 10001, MAX_S =原创 2014-03-09 21:10:24 · 807 阅读 · 0 评论 -
POJ 1178 - Camelot (枚举+dp : floyd)
点击打开链接/************************************************************************poj 1178 (IOI 1998) - dp : floyd枚举64个终点 * 枚举64个接国王点 * 枚举64只来接的骑士总复杂度O(64*64*64)原创 2014-06-14 15:34:45 · 703 阅读 · 0 评论 -
石子合并问题(动态规划)
#include #include #include using namespace std;const int MAX_N = 101;const int INF = 0x3f3f3f3f;int n;int a[MAX_N];int d[MAX_N][MAX_N];int sum[MAX_N];void solve(){ //init sum[] sum[0] =原创 2014-06-14 21:19:42 · 2015 阅读 · 0 评论 -
UVA - 562 Diving Coin (动态规划,01背包)
点击打开链接题意:有一袋硬币,要将它分成两份,求他们各自的总和最小值。价值跟重量相同的01背包,重量为总硬币之和的一半。稍微吐槽一下,UVA又被卡爆了。UVa Online JudgeThis site is temporarily unavailable.Could not connect to the database原创 2014-03-10 10:44:29 · 1208 阅读 · 0 评论 -
UVA - 116 - Unidirectional TSP(动态规划)
点击打开链接题意:从第一列开始走到最后一列,有3个行走的方向:右,右前,右下,可以从第一行穿越到最后一行。每个格子都有一个数值表示代价,求走到最后一列最小代价。WA了好几次,忽略了许多细节问题(下标),在比较字典序的时候也出了问题,为了简便一些直接用了回溯,下降序列时要逆序计算。AC代码:#include #include #include using namespace原创 2014-03-10 08:19:44 · 875 阅读 · 0 评论 -
POJ - 2385 Apple Catching(动态规划)
初学DP,虽然都是简单的DP,但每做出一道题都不容易啊,不能仅仅局限于一题,更重要的是要触类旁通。dp[i+1][j] = max(dp[i][j], dp[i][j-1]) + ( t==(j&2+1) ? 1:0);表示前i个苹果,走j次的最大获得值。可以压缩空间用一维数组即可。其中( t==(j&2+1) ? 1:0)表示:若已停留在该树,则+1;#include原创 2014-03-03 10:46:22 · 807 阅读 · 0 评论 -
POJ - 2229 Sumsets (动态规划)
题目连接很巧妙的一道题,需要找到奇偶数的递推关系。1、当N为奇数时:d[N] = d[N-1];2、当N为偶数时:d[N] = d[N-1] +d[N/2];#include #include using namespace std;const int MAX_N = 1000001;int d[MAX_N];int main(){ int N; scanf("原创 2014-03-02 16:20:29 · 965 阅读 · 0 评论 -
UVA - 10405 Longest Common Subsequence(动态规划:LCS)
点击打开链接被空格坑了一下下……要用gets(),若读取不到字符串则返回NULL(读EOF)#include #include #include using namespace std;const int MAX_N = 1010;int N;int dp[MAX_N][MAX_N];char s[MAX_N], t[MAX_N];int LCS(char s[]原创 2014-03-04 21:32:30 · 620 阅读 · 0 评论 -
UVA - 111 History Grading (动态规划:LCS)
题目连接最长公共子序列#include #include #include using namespace std;const int MAX_N = 21;int N;int ans[MAX_N], s[MAX_N], d[MAX_N][MAX_N];int LCS(){ memset(d, 0, sizeof(d)); for(int i = 0; i <原创 2014-03-04 19:42:42 · 783 阅读 · 0 评论 -
GUETOJ - 1119 How many ways(动态规划)
http://acm.guet.edu.cn/problemset/problem/1119#include #include #include using namespace std;const int MAX_N = 101;int N, M, T;int a[MAX_N][MAX_N], dp[MAX_N][MAX_N];bool in(int x, int y){原创 2014-03-05 21:55:48 · 674 阅读 · 0 评论 -
GUETOJ - 1116 免费馅饼(动态规划)
http://acm.guet.edu.cn/problemset/problem/1116数塔模型自底向上求解dp【i】【j】 = 第i分钟,位置j的最大馅饼数。dp【i】【j】 = Max{ dp【i+1】【j-1】, dp【i+1】【j】, dp【i+1】【j+1】}注意边界。答案为dp【0】【5】(起点)。#include #include #include原创 2014-03-06 09:58:15 · 782 阅读 · 0 评论 -
UVA - 624 - CD(动态规划,背包,打印路径)
点击打开链接题意:储存空间为N,有T首个,要求尽可能的填满储存空间,输出存放的歌曲和总的占用空间。分析:01背包,打印路径。#include #include #include using namespace std;const int MAX_N = 100000, MAX_M = 21, INF = 0x3f3f3f3f;int N, T;int a[MAX_M];i原创 2014-03-13 15:47:06 · 957 阅读 · 0 评论 -
UVA - 10003 - Cutting Sticks(动态规划)
点击打开链接题意:给出一个长度为L的木棍和N个要切的点pt[i],每次切割的代价为切割前木棍的长度,求总代价的最小值。记忆化搜索:d[x][y] = 区间[x, y]的最小代价。d[x][y] = min(d[x][y], dp(x, pt[i])+dp(pt[i], y)+(y-x));2.179MS……#include #include #include原创 2014-03-09 15:19:51 · 714 阅读 · 0 评论 -
UVA - 10192 - Vacation (动态规划, LCS)
点击打开链接稍微修改了上面的代码提交了,LCS部分完全没错,但第一次TLE,然后修改了一下输入WA了,最后参考别人的输入才AC了。题目原文:The end of input occurs when the first sequence starts with an "#"character (without the quotes)第一次是:scanf("%s%s", a, b) &原创 2014-03-10 09:24:06 · 750 阅读 · 0 评论 -
UVA - 674 - Coin Change(动态规划)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=615d[i][j] = 前i个硬币,金额为j的分发。先求出coin[0](即1便士)的总的分发,在求出coin[1]的总的分发,加上d[i-1][j],一层层叠加,最后答案便是:原创 2014-03-09 13:13:33 · 1018 阅读 · 0 评论 -
POJ 1179 Polygon(动态规划:类似环形石子合并)
#include #include #include using namespace std;const int MAX_N = 51;const int INF = 0x3f3f3f3f;int n;int a[MAX_N * 2];char e[MAX_N * 2];int dMax[MAX_N * 2][MAX_N * 2];int dMin[MAX_N * 2][MAX原创 2014-06-18 14:09:15 · 1065 阅读 · 0 评论