
Dynamic programming
文章平均质量分 69
X-Wyatt
For free 邮箱whitezhangv5@gmail.com
展开
-
HDU 4283
两种方法,不过先用next_pernutation先找出全排列再判断该排列的是否能符合栈模拟的规则的方法TLE,虽然TLE但是也提供了一种思路,也贴上吧#include #include #include #include using namespace std;#define LEN 101int n[LEN];int ans[LEN][LEN][LEN];in原创 2012-09-11 19:18:57 · 601 阅读 · 0 评论 -
UVa 147
动归的复习,完全背包问题精度问题卡了好长时间,double 转 int 时要加0.5#include #include #include using namespace std;#define LEN 30005int mon[11] = {5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000};long long a原创 2013-05-04 15:24:24 · 710 阅读 · 0 评论 -
UVa 103
DAG模型的复习,始终AC不了,不知为何~~~~(>_#include #include #include #include #include #define SIZE 35#define MAX(A,B) (A>B?A:B)using namespace std;vector vct[SIZE];int vis[SIZE], d[SIZE];int ro原创 2013-05-03 17:47:13 · 770 阅读 · 0 评论 -
UVa 348
矩阵连乘问题, 需要注意的是 () 的输出问题现放出用递归写的一个RE代码, 递归这里会暴栈:#include #include #include using namespace std;#define MIN(A,B) (A<B?A:B)int path[15][15];int d[15][15];int a[15][2];int dp(int s, int e)原创 2013-05-09 13:14:57 · 912 阅读 · 0 评论 -
UVa 11081
只确定除了状态量, 没想出状态方程, 这道题的难度还是挺大的.下面是别人的解题报告:http://par.cse.nsysu.edu.tw/~advprog/advprog2008/11081.doc代码:#include#include#define MAXN 65int n;char s1[MAXN], s2[MAXN], s3[MAXN];int f1[MAX原创 2013-05-09 21:41:51 · 886 阅读 · 0 评论 -
POJ 1178 Floyd
先给一个我最先写的一个代码吧。总体思路是这样的,对于每个输入的点,都进行一次广搜,打出到达其他点的最短路径(这个效率相比于floyd太低了)再加在ans数组当中,最后搜索出最小值,并输出。虽然这个代码能过很多数据,但是 Discuss 里A1A2A3H2H5H6H7H8C1C2C5C6C7E2E3E4E5E6E7E8 就过不了。至于原因还望大牛们给予指点。我预测可能是广搜有问题,我原以为,用广原创 2012-09-14 14:31:18 · 520 阅读 · 0 评论 -
HDU 4597
搜索题因为是两个人选数,并且都希望得到最优,随意需要枚举搜索4中情况,从中找到最优的#include #include #include using namespace std;#define LLEN 30int card1[LLEN], card2[LLEN];int dp[LLEN][LLEN][LLEN][LLEN];int sum1[LLEN], su原创 2013-12-08 15:23:43 · 883 阅读 · 0 评论 -
HDU 1207
汉诺塔问题,本来以为是个递推公式的题,f[n] = 2*f[n-2] + 3;后来发现当计算到 f[12]的时候就出错了,搜解题报告后发现原来是个动归的题其中需要用double 类型来存储数据,#include #include #include using namespace std;double a[65];double f[65];int main() { int原创 2013-12-13 13:08:40 · 1217 阅读 · 0 评论 -
LA 3384
约瑟夫问题的变种,输入n,k,m 表示有n个人,每数k个删除一次,最开始从m开始。最原始的约瑟夫是每数两次删除一次,公式如下:f(1) = 1f(2n) = 2*f(n) - 1f(2n+1) = 2*f(n) + 1理解的时候这么想:因为是递推,当有一个人的时候不能删除,即为终止状态。之后每次计算的时候依赖于前边的值,拿偶数为例,第二圈为 x 的人即为上一圈 2x-1 位置的原创 2013-12-16 15:27:57 · 760 阅读 · 0 评论 -
UVa 10635
最长公共子序列的问题,不过看了其他的代码是把该问题想最长上升子序列转换的(LIS问题可以在nlogn时间内解决,不理解为何不是n^2)代码如下:#include #include #include #include #include using namespace std;#define LLEN 80000#define INF 99999999int a[LLEN原创 2013-12-17 21:20:19 · 767 阅读 · 0 评论 -
UVa 10891
一开始以为只抽一个数,后来发现原来是从一端抽取一列数#include #include #include #include using namespace std;int num[104][104];int sum[104];/*int dfs(int s, int e) { if(num[s][e]) return num[s][e]; if(s > e) retur原创 2013-12-17 22:37:34 · 1010 阅读 · 0 评论 -
POJ 1837
一开始想用集合枚举的方式,后来看了别人的解题报告发现原来通过转换可以变为一个01背包问题。dp[i][j] 表示前 i 个砝码,平衡系数为 j 的时候种类个数。其中 j 为7500为平衡状态(7500 = 15*20*20*25/2,因为不允许存在负数为数组下标,所以除以2)。这里当在左边的时候 j 减去一个数,在右边的时候加上一个数。当左右平衡的时候即会回到7500这个平衡状态。方程原创 2013-12-19 13:47:53 · 824 阅读 · 0 评论 -
HDU 1025
最长公共子序列的变形, 但是如果直接使用原来的方式做的话, 时间复杂度为O(n^2) 超时, 所以这里要用二分进行优化, 每次都将之前没有用的数据清除掉, 其中使用了贪心的思想#include #include #include #include #define _MAX 99999999#define LEN 500005#define MAX(A,B) (A>原创 2013-05-16 19:00:41 · 1016 阅读 · 0 评论 -
HDU 1503
就是最长公共子序列的加强版,回溯记录一下最长的那个子序列,然后输出即可不过我的代码一直WA,也没有找到什么错误,桑心WA代码:#include #include #include using namespace std;#define LEN 110#define MAX(A,B) (A>B?A:B)int dp[LEN][LEN];char str1[LEN],原创 2012-12-18 19:00:36 · 464 阅读 · 0 评论 -
HDU 1069
类似于求最长递减子序列,这里对每个输入的立方体都构造为6个。height[i]表示第i个立方体放入后所能够达到的最大高度#include #include #include #include using namespace std;#define MAX(a,b) (a>b?a:b)#define LEN 200typedef struct Node { int x, y原创 2012-09-13 14:52:52 · 459 阅读 · 0 评论 -
HDU 2159
dp[j][l] = Max(dp[j][l],dp[j-c[i]][l-1]+w[i])它表示 用掉了j点的忍耐度,并且杀了l个怪后,所获得的最大经验数。一开始的两个状态变量分别是杀死第j个怪和还需多少经验升级,后来发现这样的话无法判断是否能够升级,因为dp[s][0]只表示还需0点经验所拥有的最小忍耐度,而0本身只依赖前面的dp数组,无法判断是否升级,后来改了状态变量。#in原创 2012-09-12 12:19:38 · 485 阅读 · 0 评论 -
HDU 1081
Two-dimensional maximum sum, only from one-dimensional changing#include #include #include using namespace std;#define LEN 110#define MMAX(a,b) ((a)>(b)?a:b)int map[LEN][LEN];int b[LEN];原创 2012-10-08 20:42:31 · 614 阅读 · 0 评论 -
HDU 1087
恶心到我的一道水题,没有1A的原因是我把两个long long 数组都申请了栈空间。#include #include #include using namespace std;long long num[1001];int main() { int n; long long ans[1001]; while(scanf("%d", &n)&&n)原创 2012-11-01 19:50:33 · 367 阅读 · 0 评论 -
UVa 111
第二次刷这个题了,动归,空间上从原来的 n^2 到现在的 2n,做了优化PS:原来的代码找不到了,从网上download了一个,思想是一样的#includeusing namespace std;const int MAXN = 30;int aim[MAXN], now[MAXN], f[MAXN][MAXN];int max(int x, int y) {return (x >原创 2012-12-06 01:46:50 · 395 阅读 · 0 评论 -
UVa 674
硬币找零,其本质就是组合问题,所以在写的时候要使 coin 成严格的非递减序列具体的题号不记得了,当时用的不是记忆化搜索的方式:#include #include int step[18] = {0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289};int main() {原创 2012-12-08 18:26:13 · 486 阅读 · 0 评论 -
UVa 624
DAG模型,转换一下思维方式,其实就是个01背包问题。这里需要输出路径,所以用二维的 path来记录dp[j] = MAX(dp[j], dp[j-num[i]]+num[i]);这里用来保存dp数组,即容量为 j 的背包所能装载的最大价值。这里将每个 track 值都转换为 重量和价值都相等的物品。#include #include #include using namesp原创 2012-12-11 18:12:50 · 541 阅读 · 0 评论 -
UVa 437
DAG不固定起点的最长路径问题:#include #include #include #include using namespace std;#define LEN 2000#define MAX(A,B) (A>B?A:B)typedef struct Node { int x, y, z;}Node;Node box[LEN];int height[LEN][原创 2012-12-12 11:29:29 · 623 阅读 · 0 评论 -
UVa 10003
这道题在时间上卡了常数因子,所以用记忆化搜索的方式无法AC。常数因子来自于递归调用所带来的时间开销记忆化搜索的代码:#include #include #include using namespace std;#define LEN 1000#define MMAX 99999999#define MIN(A,B) (A<B?A:B)int num[LEN];int原创 2012-12-12 18:10:50 · 497 阅读 · 0 评论 -
POJ 1018
WA代码,以为是简单动归:#include #include #include using namespace std;#define LEN 101#define MMAX 0x3f3f3f3fint main() { int n, m, num; int i, j; int bb, pp, b, p; int tmpb, tmpp; double tmpmax;原创 2012-12-16 20:49:17 · 474 阅读 · 0 评论 -
HDU 1114
一道动归的水题 一开始AC的代码:#include #include #include using namespace std;#define MIN(A,B) (A<B?A:B)#define LEN 10001#define MMAX 0x3f3f3f3fint dp[LEN], mark[LEN];int main() { int t, e, f; i原创 2012-12-17 18:47:18 · 410 阅读 · 0 评论 -
HDU 1059
多重背包问题:#include #include #include #include using namespace std;#define LLEN 60005int main() { int n[7]; int cse = 1; int flag = 0; while(scanf("%d%d%d%d%d%d", &n[1], &n[2], &n[3], &n[4]原创 2014-04-12 08:43:53 · 879 阅读 · 0 评论