随笔分类 -  动态规划(DP)

摘要:View Code 1 /* 2 DP: 3 状态转移方程: 4 DP[i][j]记录的是 前 i 个人完成 j 个 A 工作后 还可以 完成多少 B 5 二分: 6 找到可能花费的最小时间 maxtime,和最大时间 mintime 7 midtime=(maxtime+mintime)>>1; 8 9 midtime 就相当于背包容量10 看是否能装下 11 12 */ 13 #include<iostream>14 #include<cstdio>15 #include<cstring>16 using namespace std;17 1 阅读全文
posted @ 2012-05-11 21:13 知行执行 阅读(242) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 最短路 + 0-1背包 3 先用 DIJ 求出 起点到各个点的最短距离 相当于 4 各个物品的体积,各个点的宝物数 相当于 价值 5 总粮食相当于 背包容量 6 剩下的就是 纯粹的 0-1背包问题了 7 */ 8 #include<iostream> 9 #include<cstdio> 10 #include<cstring> 11 #include<algorithm> 12 using namespace std; 13 14 const int size = 110; 15 const int inf = 阅读全文
posted @ 2012-05-10 20:14 知行执行 阅读(162) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 思路: 3 我们可以对棋盘进行横向切割和竖向切割 4 s[n][x1][y2][x2][y2]表示:棋盘的左上角坐标是(x1,y1),右下角坐标 5 为(x2,y2) 把这个棋盘分割成 n 一块 6 横向分割: 7 可以在 a处分割 (x1=<a<x2) 比较是 留哪一个继续分割 8 for(a=x1;a<x2;++a) 9 { 10 r=min(r,min(slove(num-1,x1,y1,a,y2)+sum(a+1,y1,x2,y2),//对上边递归继续分割 11 ... 阅读全文
posted @ 2012-04-14 12:20 知行执行 阅读(197) 评论(0) 推荐(0)
摘要:这是一道动态规划题目,利用一维数列的最大子段和求多维的最大子段和。下列代码中的 psub()子函数就是求一维数列的动态规划。我们依次吧几行数据加到一行上相当于选中了好几行,然后再判断取几列能使其最大。自己的代码:View Code 1 #include<stdio.h> 2 3 int map[101][101]; 4 int sum; 5 int r,c; 6 7 void psub(int i) 8 { 9 int j,t=0;10 for(j=0;j!=c;++j)11 {12 if(t>0)t+=map[i][j];13 else t=map[i... 阅读全文
posted @ 2012-04-09 21:50 知行执行 阅读(167) 评论(0) 推荐(0)
摘要:NYOJ 61 传纸条是一个双线DP的题:从矩阵的左上角(1,1)点到矩阵的右下角(m,n)点找到两条不相交的路径使其值最大,题中是从(1,1)到(m,n)走一次,再从(m,n)到(1,1)走一次,我们可以等价变形一下,变为:同时从(1,1)走向(m,n)找两条路,且这两条路不相交,同时走!假设有两个人在走,一个人的坐标为(x1,y1),另一个人的坐标为(x2,y2),有题中规定只能向下或向右走,则可得状态转移方程:f(x1,y1,x2,y3) = max { f(x1-1,y1,x2-1,y2) ,f(x1-1,y1,x2,y-1), f(x1,y1-1,x2-1,y2), f(x1,y1- 阅读全文
posted @ 2012-04-09 17:10 知行执行 阅读(718) 评论(0) 推荐(0)
摘要:View Code 1 /* 2 问题:输入一组括号 看需要最少添加几个括号才能使 3 这组括号匹配 4 思路:DP 5 dp[j][i]表示从第j个字符到第i个字符这个括号串最少需要添加几个能使 6 这个子串匹配 7 则有 8 1.如果从j 到 i-1没有能与i匹配的则有 9 dp[j][i]=dp[j][i-1]+1;10 2.若从j 到i-1有与i匹配的(假如为第k个)则有11 dp[j][i]=dp[j][k-1]+dp[k+1][i-1];(可能有多个与i都匹配 取最小的) 12 */ 13 #include<ios... 阅读全文
posted @ 2012-02-10 17:26 知行执行 阅读(288) 评论(0) 推荐(0)