Dynamic Programming
文章平均质量分 73
unixcsir
Coding Every Day~
展开
-
poj_3624
/ * * Naked 01 knapsack problem * Not nonsense directly on the code* /#include #include #include using namespace std;#define MAXN 12881int dp[MAXN];int zero_one_package(int max_v, int原创 2012-09-26 18:56:14 · 196 阅读 · 0 评论 -
uva_624
/* * 01背包问题 * 但是要注意输出的问题 * 状态转移的时候记录当前状态的当前值是否已选 * 最后递归输出结果*/ / * * 01 knapsack problem * However, to pay attention to the problem of the output * Record the current state of the current valu原创 2012-09-27 10:05:33 · 234 阅读 · 0 评论 -
poj_2184
/* * 01背包問題 * 把smart看做背包的體積,fun當做物品的價值,問題轉化為 * 求01背包的最大價值 * 狀態:dp[i] 表示體積si為i時的fun最大價值 * 狀態轉移:dp[i] = max(dp[i], dp[i-sj]+fj); * 需要注意的是,背包價值都可能為負數,解決方案是整體左移 * 01 knapsack problem * The volum原创 2012-09-27 17:22:36 · 206 阅读 · 0 评论 -
poj_3181
/* * 高精度完全背包 * High precision completely backpack*/#include #include #define MAXN 1001#define MAXLEN 50char dp[MAXN][MAXLEN], zero[MAXLEN];void add(int u, int v){ int tmp_val, bit(0); f原创 2012-09-29 09:16:35 · 307 阅读 · 0 评论 -
poj_2923
/* * 狀態壓縮+01背包 * 題意為:給你2個卡車的承載量和一些物品的重量,要求使用卡車將物品從一個地方運送到另一個地方 * 并且要求運送的次數最少 * 題解:由於物品的數量(1<=n<=10),使用二進制的思想枚舉出所有可能,也就是每個物品的組合狀態 * 對於每個狀態下的物品,枚舉出所有組合的可能,并且判斷是否能讓car1和car2一次運送,若能,則記錄下來 * 然後狀態:dp[原创 2012-09-28 16:03:34 · 406 阅读 · 0 评论 -
hdu_2546
/* * 首先用5元买价值最大的,然后就是zero one knaspsack * First 5 yuan to buy the largest value, then zero one knaspsack*/#include #include #include using namespace std;#define MAXCNT 1001int dp[MAXCNT],原创 2012-09-28 17:40:54 · 270 阅读 · 0 评论 -
hdu_2602
/* * 01背包裸题*/#include #include #include using namespace std;#define MAXN 1001#define MAXV 1001int val[MAXN], vol[MAXN], dp[MAXV];int zero_one_package(int n, int max_v){ memset(dp, 0, si原创 2012-09-28 16:12:27 · 208 阅读 · 0 评论 -
uva_562
/* * zero one knaspsack*/#include #include #include using namespace std;#define MAXN 50001#define MAXCNT 101int dp[MAXN], val[MAXCNT];int zero_one_knaspsack(int n, int max_v){ memset(dp原创 2012-09-28 17:39:08 · 270 阅读 · 0 评论 -
uva_674
/* * 完全背包問題,裸題,不多解釋*/#include #include #include using namespace std;#define MAXN 8000#define COINTYPE 5int coin_type[] = {50, 25, 10, 5, 1};unsigned int dp[MAXN];unsigned int complete_k原创 2012-09-28 20:40:36 · 215 阅读 · 0 评论 -
hdu_1059
/* * 使用二进制优化,普通多重背包超时 * The use of binary optimization, ordinary multiple backpack timeout*/#include #include #include using namespace std;#define MAXTYPE 7#define MAXN 120001int dp[MAXN原创 2012-09-30 12:11:59 · 180 阅读 · 0 评论 -
hdu_1176
/*状态:dp[i][j], 表示人在第i秒在j个位置上所得到的最大馅饼数状态转移: dp[i][j] += max(dp[i+1][j], dp[i+1][j-1], dp[i+1][j+1])*/#include #include #include using namespace std;#define MAXCOL 11#define MAXROW 100001unsig原创 2012-09-30 18:35:05 · 202 阅读 · 0 评论 -
hdu_1421
// sort// dp[i][j] -> pre i thing choose j pair// dp[i][j] = min(dp[i-1][j], dp[i-2][j-1]+cost(i, i-1));#include #include #include using namespace std;#define MAXN 2001#define MAXP原创 2012-09-30 19:55:16 · 183 阅读 · 0 评论 -
poj_1276
#include #include #include using namespace std;#define MAXV 200001#define MAXN 11int dp[MAXV], val[MAXN], cnt[MAXN];void zero_one_knapsack(int max_v, int v){ for(int i = max_v原创 2012-09-30 21:56:48 · 178 阅读 · 0 评论 -
poj_1787
/* * 此題如果使用多重背包做的話,即使加上了二進制優化,效率也不是很高 * 此題使用完全背包本人覺得效率還可以,完全背包和多重背包在這狀態和狀態轉移方程是一樣的 * 不同的就是路徑記錄的處理 * If this question using multiple backpack to do, even with a binary optimization, efficiency is n原创 2012-09-29 13:11:54 · 268 阅读 · 0 评论 -
poj_3260
/* * 我認為,首先求出能支付的錢的特定數目(多重背包) * 之後在上面的基礎上對找錢進行完全背包,即可解決 * I think that first obtained the money can be paid a certain number (multiple backpack) * After completely backpack on the basis of the abo原创 2012-09-29 19:51:15 · 297 阅读 · 0 评论 -
hdu_1025
/* * 最长非递增序列变形 * 需要注意的是O(n^2)的算法不能过, 需要O(nlogn)的算法 * The longest non-increasing sequence deformation * Is O (n ^ 2) algorithm can not be too, needs O (nlogn) algorithm*/#include #include #incl原创 2012-09-30 10:04:06 · 204 阅读 · 0 评论 -
poj_2392
先对数据按照限制从小到大排序,接着根据限制进行多重背包#include #include #include using namespace std;#define MAXN 401#define MAXV 400001#define TOP 40001int dp[MAXV];typedef struct $ { int val, cnt原创 2012-10-01 19:57:26 · 273 阅读 · 0 评论 -
hdu_1114
多重背包#include #include #include using namespace std;#define MAXV 10001#define MAXN 501#define INF 0x3f3f3f3fint w[MAXN], p[MAXN], dp[MAXV];int complete_knapsack(int max_v, int n)原创 2012-10-01 20:37:00 · 177 阅读 · 0 评论 -
hdu_2129
二进制优化的多重背包#include #include #include using namespace std;#define MAXN 101#define MAXV 101int dp[MAXV], p[MAXN], w[MAXN], c[MAXN];void complete_knapsack(int max_v, int v, int w){原创 2012-10-01 20:15:14 · 291 阅读 · 0 评论 -
hdu_3033
// 分組背包變形,要求每組物品最少取1次// 把原來分組背包的循環順序換轉一下就可以了// 原因是原來分組背包的要求是每組物品最多取1次// 狀態就是:dp[i][j] 表示前i組物品中,使用j的v所取得的最大值// 狀態轉移:dp[i][j] = max(dp[i][j], dp[i][j-v[k]]+w[k], dp[i-1][j-v[k]]+w[k]);// 這裡的順序不能改變,原创 2012-10-05 10:36:37 · 205 阅读 · 0 评论 -
hdu_2639
// 第K大背包問題// 這好比從一個年級中選擇成績前10名的同學// 則最少要知道每個班中的前10名同學的成績// 對於每個狀態增加以維,表示當前的第K大// 因為對於狀態轉移方程,dp[j] = max(dp[j], dp[j][j-v[i]]+w[i])// 最大值要麼是dp[j], dp[j][j-v[i]]+w[i],之一,另外一個呢,可能是// 第2大,第3大...#in原创 2012-10-04 17:07:29 · 259 阅读 · 0 评论 -
poj_3211
// 01背包,需要计算出每洗的种衣服所需要的最少时间// 从总的时间/2开始枚举01背包#include #include #include using namespace std;#define MAXV 100001#define MAX_CHAR 20#define MAX_COLOR 11#define MAX_CLOT原创 2012-10-06 15:20:47 · 290 阅读 · 0 评论 -
hdu_3535
// 题目给了很多类别的物品。用 数组dp[i][j],表示第i组,时间为j时的快乐值。每得到一组工作就进行一次DP,所以dp[i]为第i组的结果。 // 第一类,至少选一项,即必须要选,那么在开始时,对于这一组的dp的初值,应该全部赋为负无穷,这样才能保证不会出现都不选的情况。// 状态转移方程:// dp[i][j]=max(dp[i][j],max(dp[i][j-w[x原创 2012-10-08 10:56:49 · 244 阅读 · 0 评论 -
hdu_1712
/* * 分组背包问题 * 状态:dp[i][j], 表示前i个科目,使用j天所获得的max gain * 状态转移方程: dp[i][j] = max(dp[i-1][j], dp[i-1][j-k] + val[i][k])*/#include #include #include #define MAXN 101using namespace std;int dp[MAX原创 2012-09-23 20:11:37 · 199 阅读 · 0 评论 -
uva_10003 Cutting Sticks
这里的根据矩阵连乘的原理一样dp[i][j] = min(dp[i][k]+dp[k][j]+len[i,j]);由于状态表示比较复杂,果断使用记忆化搜索ok,一开始开数组1000*1000超时了,当时一面茫然..然后仔细想想,可以把数组开成50*50的,0.3s Accepted.状态没有减少估计是这里的测试数据case 太多了,主要的时间是使用在dp数组的初始化了#include原创 2012-10-29 22:07:34 · 224 阅读 · 0 评论 -
uva_10066 The Twin Towers
又一道lcs,不多说,本blog有大量lcs题目解释#include #include #include using namespace std;#define MAXN 100+10int first[MAXN], second[MAXN], dp[MAXN][MAXN];int dynamic_programming(const int &len_first, con原创 2012-10-30 17:15:46 · 231 阅读 · 0 评论 -
uva_10192 Vacation
又是lcs...#include #include #include using namespace std;#define MAXN 100+10int first[MAXN], second[MAXN], dp[MAXN][MAXN];int dynamic_programming(const int &len_first, const int &len_second原创 2012-10-30 17:28:10 · 225 阅读 · 0 评论 -
uva_10131 Is Bigger Smarter?
lcs...#include #include #include using namespace std;#define MAXN 1001typedef struct NODE_ { int w, s, idx;}NODE;NODE val[MAXN];int dp[MAXN], pre[MAXN];int cmp(const NODE &a,原创 2012-10-30 17:30:58 · 203 阅读 · 0 评论 -
uva_147 Dollars
输入输出很重要#include #include #include using namespace std;#define COIN_TYPE 11#define MAXN 30000 + 1000int coin[] = { 10000, 5000, 2000, 1000, 500, 200, 100, 50,原创 2012-10-30 18:01:31 · 268 阅读 · 0 评论 -
uva_357 Let Me Count The Ways
#include #include #include using namespace std;#define COIN 5#define MAXN 30000+10unsigned long long dp[MAXN];int coin[] = {1, 5, 10, 25, 50};void complete_knapsack(void){ me原创 2012-10-30 18:15:45 · 246 阅读 · 0 评论 -
uva_348 Optimal Array Multiplication Sequence
简单的矩阵连乘法,我是使用记忆化做的。#include #include #include using namespace std;#define MAXN 11#define INF 0x3f3f3f3ftypedef struct m_NODE { int l, r;}NODE;NODE m[MAXN];int mid_pos[MAXN]原创 2012-10-30 21:22:01 · 250 阅读 · 0 评论 -
uva_562 Dividing coins
这里只需要从一半开始枚举就可以了#include #include #include using namespace std;#define MAXN 101#define MAXV 50001int v[MAXN], dp[MAXV];int dynamic_programming(const int &n, const int &max_v){原创 2012-10-30 20:05:54 · 221 阅读 · 0 评论 -
poj_1050_To the Max
此题的思想是dp,是最大连续子段和的变形题目。由一维变成了二维,思想还是一样的,和两行相加变成一行,同理。#include #include #include using namespace std;#define MAXN 101#define INF 0x3f3f3f3fint v[MAXN][MAXN], dp[MAXN], ans;int select原创 2012-10-25 13:36:07 · 190 阅读 · 0 评论 -
uva_624_CD
裸的背包题目+路径回溯#include #include #include using namespace std;#define MAXN 21#define MAXV 10001int v[MAXN], dp[MAXV], pre[MAXN][MAXV];void back_track(const int &idx, const int &cur_v){原创 2012-11-02 22:13:58 · 241 阅读 · 0 评论 -
poj_1083_Moving Tables
1.门的号必须进行转换,转换规则如下:奇数则n/2+1, 偶数 n/22.枚举区间去rst = max_val*10.#include #include #include using namespace std;#define MAXN 201int rst[MAXN];int main(int argc, char const *argv[]){#ifndef O原创 2012-10-25 16:54:43 · 213 阅读 · 0 评论 -
poj_1088_滑雪
经典dp问题/记忆化搜索状态:rst[x][y] 表示从坐标x,y开始获得的最大长度状态转移方程:rst[x][y] = max(rst[xi][yi])+1; 其中xi,yi为达到x,y的合法坐标#include #include #include using namespace std;#define DIR 4#define MAXROW 101#define原创 2012-10-25 17:28:46 · 251 阅读 · 0 评论 -
10130 SuperSale
一开始想到的是全家能带出去的,当然啦,这样想幸好样例过不了,不然是ym了,然后想每个人做一次背包的总和,ok,样例过了,submit accepted#include #include #include using namespace std;#define MAXG 131#define MAXN 1001int p[MAXN], w[MAXN], G[MAXN],原创 2012-11-05 11:23:17 · 266 阅读 · 0 评论 -
uva_111
lcs模板题,看懂题目应该没有问题了。#include #include #include using namespace std;#define MAXN 21int std_order[MAXN], submit_order[MAXN], dp[MAXN][MAXN];int lcs(const int &n){ memset(dp, 0, size原创 2012-09-21 15:53:30 · 235 阅读 · 0 评论 -
uva_103_Stacking Boxes
想清楚了其实就是一个DAG图的最长路径问题,白书上有详细说明,能嵌套的加一条边,然后记忆话搜索,求出DAG上的最长路径,然后回溯输出路径。#include #include #include using namespace std;#define MAXN 35#define MAXD 11int map[MAXN][MAXD], mark[MAXN][MAXN],原创 2012-10-28 15:10:33 · 346 阅读 · 0 评论 -
uva_10405 Longest Common Subsequence
又一道lcs题目,这里要注意的是,字符串可能含有空格...#include #include #include using namespace std;#define MAXN 1001int dp[MAXN][MAXN];char stra[MAXN], strb[MAXN];int lcs(void){ int len_a(strlen(stra)原创 2012-10-28 15:24:37 · 230 阅读 · 0 评论