
ACM-DP
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
hdu 2084(dp)
题目:在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?已经告诉你了,这是个DP的题目,你能AC吗?原创 2014-05-17 18:52:43 · 877 阅读 · 0 评论 -
uva 562( 01背包)
题意:一共有n个硬币,问题解:原创 2014-10-21 23:42:56 · 622 阅读 · 0 评论 -
uva 116(dp)
题意:一个数组内有一些值(有正数有负数),求出任意第一列开始到任意最后一列结束经过的路径和最小,打印这个最小和和这条路径的行数。题解:dp,用f的二维数组保存每一步到最后一列的最小值,从第一列到最后一列递归计算出f数组,然后比较第一列的f数组的最小值,最后根据这个数字减去这个位置上数组的数找到下一个位置,将每一个位置的行数保存输出,因为数组内的数字可能为负,所以f初始化时需要注意放一个原创 2014-10-17 21:24:06 · 632 阅读 · 0 评论 -
uva 10130(01背包)
题意:有题解:原创 2014-10-23 19:27:32 · 737 阅读 · 0 评论 -
uva 103(DAG,嵌套)
题意:给出了n个箱子,和d题解:原创 2014-10-12 14:04:34 · 613 阅读 · 0 评论 -
uva 531(最长公共子序列)
题意:两个人题解:#include #include #include using namespace std;const int N = 105;string str1[N], str2[N], res[N];int f[N][N], n, n1, n2, path[N][N], flag;void sub_print(int a, int b) { if (a ==原创 2014-10-23 21:03:26 · 678 阅读 · 0 评论 -
uva 348(dp)
题意:n个矩阵liancheng题解:原创 2014-10-22 21:33:21 · 671 阅读 · 0 评论 -
uva 624(01背包)
题意:题解:#include #include const int N = 1000;const int M = 25;int track[M], n, tar, step, f[M][N * 25];void path_print() { int j = tar; for (int i = n; i >= 1; i--) if (f[i][j] != f[i - 1]原创 2014-10-23 17:09:43 · 598 阅读 · 0 评论 -
uva 10285(dp)
题意:题解:#include #include const int N = 105;int m[N][N], f[N][N], t, row, col, vis[N][N];char str[N];int flagx[4] = {0, 0, -1, 1};int flagy[4] = {-1, 1, 0, 0};void dp(int x, int y) { for (原创 2014-10-25 21:29:25 · 750 阅读 · 1 评论 -
uva 437(最长递减子序列)
题意:题解:#include #include #include using namespace std;const int N = 35;struct Block { int x, y, z;}block[N * 3];int f[N], n, t = 1, a, b, c;int cmp(Block a, Block b) { return a.x * a.y原创 2014-10-26 17:19:00 · 678 阅读 · 0 评论 -
uva 104(dp)
题意:题解:#include #include const int N = 25;int n;double m[N][N];double f[N][N][N];int path[N][N][N];void print(int t, int i, int j) { if (t == 1) { printf("%d", i); return; } print(t原创 2014-11-12 21:49:40 · 914 阅读 · 0 评论 -
uva 10465(背包问题)
题意:题解:原创 2014-10-25 20:34:48 · 709 阅读 · 0 评论 -
uva 111(最长公共子序列)
题意:题解:#include #include const int N = 25;int a[N], b[N], n, temp, f[N][N];int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &temp); a[temp] = i; } while (scanf原创 2014-10-12 00:55:53 · 703 阅读 · 0 评论 -
uva 10404(博弈)
题意:题解:#include #include #include using namespace std;const int N = 15;const int M = 1000005;int n, m, s[N], f[M], flag;int main() { while (scanf("%d", &n) != EOF) { scanf("%d", &m);原创 2014-10-28 20:27:07 · 699 阅读 · 0 评论 -
uva 10405(最长公共子序列)
题意:题解:#include #include #include #include const int N = 1005;using namespace std;int main() { string str1, str2; int f[N][N]; while (getline(cin, str1)) { getline(cin, str2); int len原创 2014-10-12 14:30:46 · 844 阅读 · 0 评论 -
uva 674(dp)
题意:题解:原创 2014-10-12 17:03:03 · 649 阅读 · 0 评论 -
uva 825(dp)
题意:题解:原创 2014-10-29 19:41:32 · 817 阅读 · 0 评论 -
uva 10051(最长上升子序列)
题意:题解:#include #include const int N = 3005;struct Cube { int b, t, w; }cube[N];int n, t = 1, num, f[N], link[N];const char str[6][8] = {"front", "back", "left", "right", "top", "bottom"};原创 2014-11-01 21:59:04 · 715 阅读 · 0 评论 -
uva 10534(最长上升子序列O(nlogn))
题意:题解:原创 2014-11-01 00:10:49 · 795 阅读 · 0 评论 -
uva 10069(dp)
题意:两个字符串a和b, 题解:#include #include const int N = 10005;const int M = 105;char str1[N], str2[M], f[M][N][M];void bignum(char *a, char *b, char *c) { int temp1 = 0, temp2; for (int i = M - 2;原创 2014-10-31 00:40:34 · 816 阅读 · 0 评论 -
uva 10651(dp + 哈希)
题意:题解:#include #include #include #include using namespace std;const int N = 15;map f;string str;int n;int dp(string s) { if (f[s] != 0) return f[s]; string temp; for (int i = 0; i原创 2014-11-02 15:14:56 · 832 阅读 · 0 评论 -
uva 590(dp)
题意:题解:原创 2014-11-03 17:37:28 · 778 阅读 · 0 评论 -
uva 10003(dp)
题意:题解:原创 2014-10-16 21:25:35 · 627 阅读 · 0 评论 -
uva 10131(最长递增子序列)
题意:题解:原创 2014-10-18 23:57:13 · 748 阅读 · 0 评论 -
uva 10066(最长公共子序列)
题意:题解:原创 2014-10-20 16:20:46 · 777 阅读 · 0 评论 -
hdu 3555(数位dp)
题意:给一个最大2^64的数字,问从1到这个数字共有多少个数字中含有‘49’,输出个数。题解:数位dp基础题,dp数组第一维还是pos,第二维判断前一位是否是4,第三维是是否出现了49,从而使枚举的数字唯一。#include #include const int N = 30;__int64 f[N][2][2];int num[N];__int64 dp(int pos,原创 2014-11-27 19:26:41 · 549 阅读 · 0 评论 -
uva 10192(最长公共子序列)
题意:两个最长gong题解:原创 2014-10-20 16:28:24 · 674 阅读 · 0 评论 -
uva 147(dp)
题意:题解:原创 2014-10-20 21:07:10 · 610 阅读 · 0 评论 -
uva 10306(完全背包)
题意:有m种硬币和目标值s,如果能最少拿k个可以让拿出的硬币的x的和和y的和的平方和等于s的平方,输出k。题解:完全背包问题,f[i][j]代表当硬币的x和y分别为i和j时最少共有多少个硬币组成,然后遍历一遍f数组选出满足条件的即i^2+j^2=s^2时最小是多少。#include #include const int N = 305;const int INF = 0x3f3f原创 2014-11-27 22:04:05 · 576 阅读 · 0 评论 -
uva 357(dp)
题意:之前有很多题解:原创 2014-10-21 19:22:46 · 696 阅读 · 0 评论 -
uva 10313(硬币dp)
题意:给出一个n,从1到n的不同面值的硬币不限数量有多少方式凑成n,如果又给出一个l1,代表用小于等于l1数量的从1到n面值的硬币有多少方式凑成n,如果又给了l2代表数量大于等于l1小于等于l2数量的从1到n面值的硬币有多少种方式组成n。题解:用了之前一直用的递归方法超时,因为每次都要预处理f[i][j]数组(f[i][j]代表面值不超过j凑成i的方案数)。递推+打表,用不超过j个硬币凑出面值原创 2014-12-16 20:08:03 · 638 阅读 · 0 评论 -
uva 10558(dp)
题意:一个100*100矩阵上有n个点,给出n个点的坐标,然后划了m条竖线,和m条竖线的坐标,然后问如果要切A条线,必须切1和100这两条线,问怎样切横线可以让区域最多,区域必须是有点存在的,边界上的点属于点右上区域。题解:想不出来,参考网上的人的题解,通过初始化用了个数组s[i][j]表示从第i条横线到第j条横线有多少个区域,然后就可以普通的dp,f[i][j]表示从第i条线到最后且还剩原创 2015-01-06 21:38:16 · 662 阅读 · 0 评论 -
uva 10401(dp)
题意:n皇后问题,输入一行字符串,长度是n就是n*n的棋盘,如果字符是‘?’就是这一列任意位置都可以摆放皇后,如果i是1~F,是这一列第i行必须摆放一个皇后。题解:f[i][j]数组是在第i行第j列摆放皇后的总方法数,状态转移方程f[i][j] += f[i - 1][k] (|j - k| > 1)。最后把最后一列的方法数加起来就是总的方法数。#include #include原创 2014-12-17 20:32:26 · 628 阅读 · 0 评论 -
uva 11081(dp)
题意:给了三个字符串,然后问有多少种方法使第一个字符串的子串和第二个字符串的子串可以组合成第三个字符串。题解:问组成方法数量的dp题总让人心塞。。。看了题解,f[i][j][k]表示第一个字符串前i个字符第二个字符串前j个字符的子串能有多少种方法组合成第三个字符串前k个字符,但是需要添加f1[i][j][k]和f2[i][j][k]分别对应第一和第二个字符串的f数组,使f[i][j][k] =原创 2015-01-07 16:35:51 · 644 阅读 · 0 评论 -
uva 10739(dp)
题意:给出一个字符串,可以增加一个字母或者删除一个字母,或者替换任何一个字母,都需要一次操作,问最少需要几次操作可以是字符串成为回文串。题解:这三个操作中增加一个字符或删除一个字符作用是一样的,做法是从两边推到中间,先用两个指针指向两端,如果字符串最两边的字符是一样的可以直接左右指针加一减一向内推进,否则有三种情况,判断如果左边指针右移一位或者右边指针左移一位(相当于添加删除操作),或者是各向原创 2014-12-02 20:01:29 · 543 阅读 · 0 评论 -
uva 10304(dp)
题意:给出n个结点,建立一个二叉搜索树,求这棵树的最小值(每个结点×它的深度的总和)。题解:dp[i][j]数组保存从结点i到j的组成的树的最小值,dp的思想是先从小到大计算有num个结点组成这棵树,然后枚举左右结点,以及从左右结点中挑选一个点作为根节点,那么如果此时将下标小于root大于l作为左子树,下标大于root小于r作为右子树,加上选出的这些结点的自身权值(深度加一,累加上去),再减去原创 2014-12-03 22:05:33 · 638 阅读 · 0 评论 -
uva 10891(dp+博弈)
题意:给出一个长度为n的数字序列,有两个玩家A、B,每次都是A先取数字,每个人每次都要取连续的1个或多个数字,不能同时从两端取数字,每个人都尽量用最优的方式来取,使自己取到的数字的总数最大。问最后A和B最大的差距是多少。题解:因为每个人都以最优的方法取数字,无法确保自己取了最大值后就可以让自己达到最优,所以思路应该是每次选出当前选择区间内的最小值,然后这个值是给对方的,自己选的值就是当前区原创 2014-12-18 19:29:33 · 578 阅读 · 0 评论 -
uva 10911(dp+状态压缩)
题意:有2×n个人组成n队,每队两人,给出了所有人的位置坐标,输出n队人两两之间之间的最小距离和。题解:这是一个集合上的最小动态规划,最优配对问题,用一个集合S表示当前人是否已经组队的状态,枚举所有情况,从0到1#include #include #include #include using namespace std;const int N = 1 << 21;cons原创 2014-12-21 18:11:34 · 605 阅读 · 0 评论 -
uva 10635(最长公共子序列nlogn)
题意:给出两个串,输出最长公共子序列。题解:直接用n^2的方法会超时,需要将问题转化成计算最长上升子序列,然后可以用二分来减小时间复杂度。方法是用一个数组将第一个串内元素在第二个串内的位置保存下来,然后将这个数组的最长上升子序列长度求出就是解。#include #include #include #include using namespace std;const int原创 2014-12-21 22:46:01 · 874 阅读 · 0 评论 -
uva 10271(dp)
题意:从n个筷子中挑选n+8个三根筷子的集合,假如三根筷子按从小到大是a,b,c,那么让8+k个总(a-b)^2的值最小。题解:用一个f[i][j]数组表示前j个筷子组成i个集合的总最小(a-b)^2值,所以dp思想就是f[i][j] = min{f[i][j - 1], f[i - 1][j - 2] + (cho[j] - cho[j - 1])^2},也就是不选cho[j]时,f[i][原创 2014-12-07 00:19:21 · 593 阅读 · 0 评论