
DP动态规划
文章平均质量分 50
Fenice
狂奔的蜗牛
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
动态规划详解
1 1,13 2 2,1 2,24 10 1原创 2012-09-26 16:51:18 · 916 阅读 · 0 评论 -
hdu 1176
//这道题可以转换成数塔问题//将时间为纵轴,距离为横轴//从上往下DP//DP[i][j] = max{DP[i+1][j-1],DP[i+1][j],DP[i+1][j+1]} + a[i][j]//吐槽一下,WA了很多次,原因是max函数写错了尼玛啊啊#include #include #define max(a,b) a>b?a:b int n;int a[100001原创 2013-04-12 02:12:34 · 671 阅读 · 0 评论 -
hdu 1203 DP
//背包//求拿到offer的概率,先算一份也拿不到的概率//DP[j] = min(DP[j],DP[j-ai[i]] + bi[i])//求出拿不到offer的最小概率,再拿一减//memset很有问题,前一部分被置为1,后一部分是随机值#include #include #include using namespace std;#define MAX 10001int原创 2013-04-12 12:56:51 · 682 阅读 · 0 评论 -
hdu 1231 最大子段和
//经典DP//b[i] = max{b[i-1] + a[i],a[i]}//用n^2的暴力会超时。//注意保存子段首尾的位置#include #include #include using namespace std;int a[10001];int b[10001];int K;bool flag;int st,en;int main(){ while(sca原创 2013-04-17 23:44:31 · 764 阅读 · 0 评论 -
hdu 1248 完全背包
//完全背包用优化DP做//F[i] = max(F[v],F[N - C[i]] + C[i]);//1a oms#include #include using namespace std;int F[10001];int C[4];int T;int N;int main(){ C[1] = 150; C[2] = 200; C[3] = 350; cin>原创 2013-04-19 23:59:14 · 717 阅读 · 0 评论 -
poj 2263 重型运输
//求从起点到终点最大运输量//运输量取决于单条路径的最大容量//用floyd算法,动规#include #include #include using namespace std;#define MAXN 201#define INF 1000000map city;int weight[MAXN][MAXN];int Edge[MAXN][MAXN];int T;i原创 2013-05-14 12:27:38 · 1165 阅读 · 0 评论 -
poj 2533 LCS
#include#include using namespace std;int a[2000];int LIS(int a[],int n){ int i,j; int ans=1; int m=0; int *dp=new int[n+1]; dp[1]=1; for(i=2;i<=n;i++) { m=0原创 2013-06-17 22:42:38 · 900 阅读 · 0 评论 -
hdu1864背包求找错
//我已经不能理解为什么WA了#include #include #include using namespace std;#define MAXN 5000000int Q;int N;int prices[35];int m;int n;char type;double price;int F[MAXN];int main(){ double q;原创 2013-08-10 16:27:58 · 1095 阅读 · 0 评论 -
hdu2571动态规划
125ms.... 太慢了。。。dp[i][j] = max(dp[i][j-1],dp[i-1][j],dp[i][k],1<k<j&&j%k==0);#include #include using namespace std;#define MAXN 21#define MAXM 1005#define INF -123456789int n,m;int C;int原创 2013-08-11 21:24:45 · 900 阅读 · 0 评论 -
hdu2159 二维完全背包
#include #include using namespace std;#define MAXN 105int n,m,k,s;int C[MAXN];int W[MAXN];int dp[MAXN][MAXN];int ans;//dp[i][j][k] = max(dp[i-1][j][k],dp[i][j-1][k-C[i]] + W[i]);//dp[j][k原创 2013-08-15 13:58:51 · 1064 阅读 · 0 评论 -
hdu1257
#include #include #include using namespace std;#define MAXN 1005int n;int dp[MAXN];int m;int main(){ while(cin>>n) { int x; m = 0; memset(dp,0,sizeof(dp))原创 2013-08-16 10:54:55 · 848 阅读 · 0 评论 -
USACO numtri 数塔问题
/*ID:kevin_s1PROG:numtriLANG:C++*/#include #include #include #include #include #include #include #include #include #include #include using namespace std;#define MAXN 1001//gobal v原创 2014-06-05 00:36:22 · 1230 阅读 · 0 评论 -
hdu 1171
//就是把一组整数序列分成2份,要使和的差值最小//就是以整个序列和的一半为容量进行背包//DP[i]以i为容量的背包最多选择的整数序列的和//DP[i] = max{DP[i],DP[i - V[i]] + V[i]}//这题没过啊,不知道为什么超时#include #include using namespace std;int N;int V[5000];int DP[原创 2013-04-11 14:12:16 · 799 阅读 · 0 评论 -
hdu 2602 01背包DP
F[i][j] = max(F[i-1][j],F[i-1][j - volume[i]] + value[i]);#include #include using namespace std;int N,V;long value[1001];long volume[1001];long F[1001][1001];int T;long max(long a,long b){原创 2013-03-28 14:33:12 · 676 阅读 · 0 评论 -
hdu 1078记忆化搜索
s[i][j]表示i,j处的最大值,s[i][j] = {s[i-k][j],s[i+k][j],s[i][j-k],s[i][j+k]}+ a[i][j]用记忆化搜索,解为s[0][0]#include #include #include using namespace std;int n,k;int s[101][101];int a[101][101];int原创 2013-03-25 23:35:58 · 734 阅读 · 0 评论 -
动态规划1
动态规划的有效性依赖于待求解问题本身具有两个重要的性质:最优子结构性质和自问题重叠。(1)最优字结构性质,如果问题的最优解包含的自问题的解也是最优的,就称该问题具有最优子结构性质(满足最优化原理),最优字结构性质为动态规划算法解决问题提供线索。(2)子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题求解时,每次产生的子问题并不总是新问题,有些自问题会被重复计算多次。动态规划正式利原创 2012-12-02 16:32:06 · 673 阅读 · 0 评论 -
hdu1003最大子序列和
看了一些别人的题解,说实话,我现在还不会证明这个,我不知道为什么这样是最大值//hdu1003最大连续子序列和// sum[i] = sum[i-1]>0 ? sum[i-1]+a[i]:a[i];//只有当sum处于增长状态时才会得到最大子序列//当sum处于减小状态时,应当更新起点 #include using namespace std;#define MAX 10000原创 2012-12-02 18:02:47 · 748 阅读 · 0 评论 -
最长公共子序列问题LCS
一个给定序列的子序列是指在原序列顺序不变的基础上删去若干元素后得到的序列。给定两个序列X和Y,当一个序列Z既是X的子序列又是Y的子序列时,称Z序列为X和Y 的公共子序列。 例如,X=【A,B,C,B,D,A,B】,Y= 【B,D,C,A,B,A】则序列【B,C,A】是X和Y的一个公共子序列,但不是X和Y的最长子序列。序列【B,C,B,A】是X和Y的最长公共子序列。 最长公共原创 2013-01-29 17:40:11 · 696 阅读 · 0 评论 -
动态规划解题法
在学习动态规划法之前,我们先来了解动态规划的几个概念1、 阶段:把问题分成几个相互联系的有顺序的几个环节,这些环节即称为阶段。2、 状态:某一阶段的出发位置称为状态。3、 决策:从某阶段的一个状态演变到下一个阶段某状态的选择。4、 状态转移方程:前一阶段的终点就是后一阶段的起点,前一阶段的决策选择导出了后一阶段的状态,这种关系描述了由k阶段到k+1阶段状态的演变规律,称为状态转移方原创 2013-01-29 18:06:02 · 1452 阅读 · 0 评论 -
hdu1159 LCS
这题没问题,题目提交的时候略坑,开200*200的数组结果WA,开了1000*1000的数组然后AC了,好奇怪的感觉,不知道为什么设序列X=【x1,x2,x3….xm】,Y =【y1,y2,y3,…..yn】的最长公共子序列为Z=【z1,z2,z3……zk】则(1)若Xm = Yn则Zk = Xm = Yn,且Zk-1是Xm-1和Yn-1的最长公共子序列;(2)若X原创 2013-01-29 23:00:26 · 550 阅读 · 0 评论 -
hdu 1087 枚举+DP
状态转移方程为b[i]=max(b[j]+a[i],b[i]) 其中(a[j]#include using namespace std;int N;int a[1001];int b[1001];int DP(){ int max = a[1]; b[1] = a[1]; for(int i = 2; i <= N; i++) { b[i] = a[i]; f原创 2013-01-31 12:17:42 · 753 阅读 · 0 评论 -
hdu 1069 DP
做的很艰难,还参考了一下别人的。。。。。子问题是以每个矩形为底的塔的最大高度,所有子问题的解中最大的一个就是原问题的解,其中以某个矩形为底的塔的高度可以由自身高度加上可以放在其上的塔的最大高度得到#include #include #include using namespace std;int n;typedef struct{ int xi; int yi; int原创 2013-03-17 23:56:18 · 760 阅读 · 0 评论 -
hdu 1114 DP
////完全背包问题//DP[v]为重量为v的钱罐最少有多少钱 //DP[v] = min{DP[v],DP[v-W[i]] + P[i]}//其实就是 DP[i,v] = min{DP[i-1,v],DP[i,v-W[i]] + P[i]}//也可以用贪心来做#include #include #define INF 9999999using namespace std;i原创 2013-03-31 18:11:47 · 640 阅读 · 0 评论 -
hdu 1158 枚举+DP
//DP[i][j]表示第i月用j个工人的最小花费//枚举+DP,k为上月使用的工人数//if(j <= k)// cost = (hiring*(j-k)) + s*j + DP[i-1][k];//else// cost = (firing*(k-j)) + s*j + DP[i-1][k];//枚举j和k,将cost的最小值填入DP[i][j];//结果为DP[mo原创 2013-04-01 00:55:52 · 792 阅读 · 0 评论 -
hdu 1208 DP
#include #include #include using namespace std;int n;char map[35][35];long long paths[35][35];bool visited[35][35];long long DP(int x,int y){ if(x = n || y = n) return 0; if(visited[x][原创 2013-03-20 23:33:53 · 781 阅读 · 0 评论 -
hdu 2084 DP
经典树塔问题DP:s[i][j] = max{s[i+1][j],s[i+1][j+1]} + a[i][j]#include #include using namespace std;int a[101][101];int s[101][101];int C;int N;int main(){ cin>>C; while(C--) { cin>>N; f原创 2013-03-24 23:32:59 · 678 阅读 · 0 评论 -
USACO money packageDP
裸0/1背包,就是从各种币种里面拿来凑足N元,求最多有多种方案。用dp[i][j]表示选前i个币种凑成j的方案数量状态转移方程: dp[i][j] = dp[i- 1][j] j = coins[i]/*ID:kevin_s1PROG:moneyLANG:C++*/#include #include #include #include #include #i原创 2014-07-01 01:49:00 · 1202 阅读 · 0 评论