
动态规划
Wss0130
这个作者很懒,什么都没留下…
展开
-
动态规划经典教程
引言:本人在做过一些题目后对DP有些感想,就写了这个总结:第一节动态规划基本概念一,动态规划三要素:阶段,状态,决策。他们的概念到处都是,我就不多说了,我只说说我对他们的理解:如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线转载 2012-08-10 09:23:52 · 11273 阅读 · 2 评论 -
动态规划算法的优化技巧
动态规划算法的优化技巧福州第三中学 毛子青 [关键词] 动态规划、 时间复杂度、优化、状态 [摘要]动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化。全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因素,然后分别阐述了对各个决定因素的优化方法,最后总结全文。 [正转载 2012-09-12 21:00:00 · 3586 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!
#include#include int main(){ int i,j,a[1000],n,temp,s[1000],max; while(scanf("%d",&n)!=EOF && n) { for(i=0;i max=0; memset(s,0,sizeof(s)); for(原创 2012-09-14 19:17:00 · 453 阅读 · 0 评论 -
ZOJ 0-1背包
这个是最简单的0-1背包了,记住这个函数,以后在遇到这种题直接使用就行了。。。 #include#include#define MAX(a,b) (a>b?a:b)int c[13000]; // 注意数组下标 void Zero_One(int cost, int weight, int m)原创 2012-08-11 08:23:22 · 542 阅读 · 0 评论 -
HDU 1114 Piggy-Bank
这是个完全背包的问题,套模板吧!#include#define min(a,b) a#define inf 6000005int f[10005]; int main(){ int i,j,n,t,E,F,W; int p[505],w[505]; while(scanf("%d",&t)!=EOF) {原创 2012-09-14 22:21:45 · 408 阅读 · 0 评论 -
HDU 1171 Big Event in HDU
0-1背包问题。。。#include#includeint v[50],m[100],a[250005];int main(){ int i,j,k,n,sum,t; while(scanf("%d",&n)!=EOF && n>=0) { sum=0; memset(a,0,sizeof(a));原创 2012-09-17 20:37:56 · 472 阅读 · 0 评论 -
题目1112:拦截导弹
// 即求动态规划的最长不增子序列// 递推关系:F[1]=1; F[i]=max{1,F[j]+1 | j=ai}#includeint max(int a,int b){ return a>b?a:b; }int list[26]; // 按袭击事件顺序保存各导弹高度int dp[26]; // dp[i]保存以第i个导弹结尾的最长不增原创 2014-03-04 12:04:15 · 954 阅读 · 0 评论 -
题目1205:N阶楼梯上楼问题
// 这是动态规划中的递推求解问题,类似于斐波那契数列。。。#includelong long F[91];int main(){ F[1]=1;F[2]=2; for(int i=3;i int n; while(scanf("%d",&n)!=EOF){ printf("%lld\n",F[n]); }原创 2014-03-04 11:30:21 · 724 阅读 · 0 评论 -
题目1451:不容易系列之一
// 动态规划中较复杂的递推求解问题。。。// 递推求解问题,根据输入的顺序,其答案往往排列成一个数列。首先得到输入规模较小的答案。// 分析问题,将每一个问题分割成规模较小的几个问题,要做到不遗漏不重复,并确定它们的关系从而得到递推公式。。。#includelong long F[21];int main(){ F[1]=0; F[2]=1;原创 2014-03-04 11:39:05 · 743 阅读 · 0 评论 -
题目1122:吃糖果
// 与题目1205:N阶楼梯上楼问题是一样的题,只是问法不同而已。。。同为递推求解问题#includeint F[21];int main(){ F[1]=1;F[2]=2; for(int i=3;i int n; while(scanf("%d",&n)!=EOF){ printf("%d\n",F[n]);原创 2014-03-04 11:43:44 · 802 阅读 · 0 评论 -
题目1209:最小邮票数
// 简单的动态规划。。。#include #define INF 1000int main(){ int f[1000]; // 邮票价值为i时的个数 int i,j,k; int M,N; int v[21]; while(scanf("%d %d",&M,&N)!=EOF){ for(i=1;i原创 2014-03-22 11:57:51 · 770 阅读 · 0 评论 -
HDU 1080 || ZOJ 1027 Human Gene Functions
分三种情况考虑: 1、s1不是 -,s2是 - dp[i][0] = dp[i - 1][0] + m[x[i]][4]; 2、s1是 -,s2不是 - dp[0][j] = dp[0][j - 1] + m[4][y[j]];原创 2012-09-12 20:42:10 · 506 阅读 · 0 评论 -
HDU 2602
很基础的0-1背包。。。#include#include#define MAX(a,b) (a>b?a:b)int c[1005],n[1005],v[1005],i,j,t,N,V; void Zero_One(int cost, int weight原创 2012-08-21 16:26:06 · 380 阅读 · 1 评论 -
HDU 1029
很简单的一个DP题。。。#include#include#define N 1000000int a[N],m[N],count[N];int cmp(const void *a,const void *b){ return *(int *)a - *(int *)b; }int main(){ int i,j,n; wh原创 2012-08-21 14:55:11 · 361 阅读 · 1 评论 -
ZOJ 1093 Monkey and Banana
这是一个动态规划题目,不是太难,只要理解动态规划思想就可以做出来。。。#include#includestruct node{ int x; int y; int z; int s; }S[100];int high[100];int cmp(const void *a,const void *b){原创 2012-08-10 11:38:33 · 574 阅读 · 0 评论 -
ZOJ 3157 逆序对
刚看到这道题时,第一感觉是双重循环,求出所有的交点的横坐标,然后判断是不是在所给范围内。毫无疑问,结果肯定超时。但换个角度想一下,转化为zoj3129的japan那道题,即是求逆序对的个数。接下来就和3129一样了。。。#include#include#include#include#include#define N 10005struct node{原创 2012-08-14 16:21:33 · 476 阅读 · 0 评论 -
HDU 1059 多重背包
个人觉得,这个可以作为多重背包的模板使用,其中包括了简单的0-1背包和完全背包,分清楚它们三个的区别。。。 #include#include#define N 60005#define MAX(a,b) (a>b?a:b)int c[N];void Complete(int cost, int weight, int m) // 完全背包, 顺序 {原创 2012-08-11 08:28:28 · 411 阅读 · 0 评论 -
HDU 3466 0-1背包
这个题需要先弄懂题意,这是使用了结构体数组,并对其中的一个关键字进行了排序。。。#include#include#include#define MAX(a,b) (a>b?a:b)int dp[5005];struct node{ int p; int q; int v; int c;}it[505];int cmp(const void原创 2012-08-11 08:26:11 · 364 阅读 · 0 评论 -
ZOJ 2386 归并排序
这个是归并排序很好例子,下面的代码可以记住,以后碰到归并,可以直接使用了。。。#include #include #include #include // INT_MAX #include #define MAX 500010int a[MAX];int L[MAX/2],R[MAX/2];long long sum;void MERGE(int原创 2012-08-11 08:35:00 · 529 阅读 · 0 评论 -
ZOJ 1076 Gene Assembly
有人说这个是最长上升子序列,但是我没有发现。。。就是找出最长不交叉的DNA片段的序号,只是按照基本的动态规划写了一下。。。#include#include#include#define N 1005int a[N];struct gene{ int start; int end; int pos; }g[N];int cmp(const voi原创 2012-08-14 16:17:04 · 637 阅读 · 0 评论 -
ZOJ 3129 Japan
题意叫你求交叉点的个数,转换一下思维,把第一个数看作是i,和它相连接的第二个数看作是ai,当i aj时这时才有交叉点,这样就转换为求逆序对的个数;首先,把他x从小到大排序,x相同的按y从大到小排序,排完序后,在使用合并排序,计算逆序对的个数。#include#include#include#define MAX 1000005 int L[MAX/2],R[MAX/2原创 2012-08-09 15:59:47 · 597 阅读 · 0 评论 -
HDU 1421 搬寝室
最近学习动态规划,总是找不出转移方程。。。 这里的是: if(i==2*j) dp[i][j]=dp[i-2][j-1]+pow2(a[i]-a[i-1]); else if(i>2*j) dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+pow2(a[i]-a[i-1])); #include原创 2012-08-14 19:20:59 · 328 阅读 · 0 评论 -
HDU 1028 整数划分
这里不能简单的递归,因为N较大,会出现超时。。。开始没注意N的大小,提交之和TLE#include #include int main() { int n; int dp[130][130]; int i,l; memset(dp,0,sizeof(dp)); dp[1][1]=1;原创 2012-08-17 10:44:38 · 444 阅读 · 0 评论 -
Defense Lines
D. Defense LinesTime Limit: 3000msCase Time Limit: 3000msMemory Limit: 131072KB64-bit integer IO format: %lld Java class name: Main SubmitStatus Font Size:+- [原创 2012-08-29 22:17:55 · 607 阅读 · 1 评论 -
题目1123:采药
// 0-1背包:每一件物品至多只能选择一件,即在背包中该物品数量只有0和1两种情况 #include#define INF 0x7fffffffint max(int a,int b){ return a>b?a:b; }struct E{ int w; // 价值 int v; // 体积 }list[101];原创 2014-03-25 15:37:52 · 579 阅读 · 0 评论