DP~动态规划
文章平均质量分 53
晃晃--
这个作者很懒,什么都没留下…
展开
-
记忆化搜索与递推
数字三角型,P160页 递推计算: int i,j; for(j =1; j <=n; j++) d[n][j]=a[n][j]; for(i=n-1;i>=1;i--) for(j=1;j<=i;j++)原创 2011-08-15 20:44:58 · 1196 阅读 · 2 评论 -
题目1480:最大上升子序列和
不用多说了,老套路 #include int a[1005],d[1005]; int main() { int n,i,j,max; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); d[0]=a[0]; for(i=1;i<n;i++) {原创 2013-09-21 18:13:27 · 1445 阅读 · 0 评论 -
题目1131:合唱队形
求以a[i]为结束结点时的最长上升序列长度,保存在d1[i]中,从前向后更新 再求 a[i]为开始结点时最长下降序列长度,保存在d2[i]中,从后向前更新 #include int a[102],d1[102],d2[102]; int main() { int n,i,j,max; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i+原创 2013-09-21 18:12:24 · 960 阅读 · 0 评论 -
北大拦截导弹
求最长不升子序列 #include int main() { int a[30],d[30],i,j,max,n; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) scanf("%d",&a[i]); d[0]=1; for(i=1;i<n;i++) { d[i原创 2013-09-21 18:11:35 · 823 阅读 · 0 评论 -
题目1123:采药
方法一原创 2013-09-21 18:10:17 · 837 阅读 · 0 评论 -
hdu 2084 dp
#include int a[102][102],d[102][102]; int main() { int t,n,i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=i;j++) scanf("%d",&a[i][j]);原创 2012-05-08 12:26:48 · 531 阅读 · 0 评论 -
zoj 1074 最大子段和的推广 dp
这道题是算法书上的例子,就照办书上的算法了。求最大子矩阵和。 #include int a[102][102]; int b[102]; int max1(int n) { int sum,x,i; sum=0,x=0; for(i=0;i<n;i++) { if(x>0) x+=b[i]; else x=b[i]; if(x>sum) sum=x;原创 2012-05-03 13:08:30 · 575 阅读 · 0 评论 -
再写pku 1088 滑雪 dp
前些天废了一阵工夫,把白皮书上所谓动态规划转化为图上最长路的思想应用了一下,写了这道1088,真是麻烦,建图过程实在繁琐,不能用邻接矩阵(超内存),需要用邻接表,当时好在还AC了,蛮高兴的。刚看到往届省赛中一道题,说是从左上角走到右下角,能拿到的最大数字和。想了想,用白皮书上的记忆化搜索很容易就可以解决的,于是重新写了一遍这道题,要比建图那种做法简单 #include #include原创 2012-05-03 12:56:45 · 725 阅读 · 0 评论 -
zoj1076 Gene Assembly 活动安排 dp
题目总不让人省心,大致有两种,一种是题目很好懂,程序不好写;另一种是题目不好懂,程序很好写。。。 题简单了就会在语言上麻烦你。。。 回顾qsort用法,第一个参数为数组名,第二个参数为元素个数,第三个为sizeof ( 数组类型),第四个为cmp函数。 #include #include typedef struct node { int beg; int end; int x;原创 2012-05-03 12:22:11 · 1138 阅读 · 0 评论 -
pku 2904 dp
dp问题一个样,想出来了觉得很简单,想不出来就很难。 #include #define N 10e8 int a[110][110][15]; int x1,x2; int dp(int i,int j,int k) { int s,r; if(a[i][j][k]!=0) return a[i][j][k]; if(k==1) { r=0; for(s=原创 2012-04-30 11:38:51 · 512 阅读 · 0 评论 -
pku百练 2727 0-1背包
d[ i ] [ j ]表示把第 i,i+1,i+2,。。。n个物品装到剩余容量为 j 的背包中的最大重量。 #include int v[105],w[105],d[105][1005]; int main() { int i,j,t,n; scanf("%d%d",&t,&n); for(i=1;i<=n;i++) scanf("%d%d",&v[i],&w[i]);原创 2012-04-26 12:18:58 · 553 阅读 · 0 评论 -
百练1088 滑雪 dp
动态规划,转化成图来做,即转化成有向图上的最长路问题。 假设建图已好,存在邻接矩阵G中。d[ i ]表示从结点 i 出发的最长路长度,则 d[i]=max { d[ j ] +1| ( i , j )属于E} E为边集合。 记忆化搜索程序(调用前d数组初始化为0) int dp(int i) { int j; if(d[i]>原创 2012-04-25 22:42:29 · 722 阅读 · 0 评论 -
zoj 1025 Wooden Sticks (DP子序列)(第100,纪念一下)
几天没做LIS问题了,变得好生疏啊! 首先声明,此种思路是从别人那看到的,感觉很神奇,就按照他的方法试了试,AC了,不过我还不明白到底为什么这样做就是答案,此种方法大致是:把序列按照 l,w的顺序二级排序(升序)后,再求出w的最大下降子序列长度L,则L就是所要求的值。。。。我只原创 2011-08-22 17:42:13 · 898 阅读 · 0 评论 -
cugb 1009 合唱队形 (子序列)
昨天看了好长时间还是没思路,看了别人的思路却没看懂,早上忍不住就问了老大一下(xy),嘿嘿,“因为求之后 枚举的是以某个数为顶点 左右两边最长的序列”,一语惊醒梦中人啊!还是我太笨呢?反正现在会了。。。。 第一次,求以a[i]为结束点的最长上升子序列, 第二次,求以a[i]为原创 2011-08-18 09:56:14 · 444 阅读 · 0 评论 -
cugb 1032 登山(子序列)
和合唱队形是一样的,具体解释见cugb 1009#include int main() { int n,a[1005],i,j,d[1005],dp[1005],max; scanf("%d",&n); for(i=0;原创 2011-08-18 10:15:46 · 377 阅读 · 0 评论 -
zoj Monkey and Banana (子序列)
这道题原来小白大哥讲过了(怎么感觉矛盾啊),按照他的思路,是把所有的箱子看成一个矩形,利用嵌套矩形来做,我把结构体中,所存x的值都不小于y的值,再把所有矩形按x的权值排序(降序),然后按照LIS的思想来做就可以了,不过d[i]里的权值不是长度,而是以a[i]为结束点时的总高度。。原创 2011-08-18 13:07:53 · 400 阅读 · 0 评论 -
DP入门之《LIS~最长不降子序列》
刚学DP没思路,就去找书看,刚开始了解了记忆化搜索与递推,对DP问题渐渐开始有了一些理解,并有了一些自己的想法,对书上描述的状态转移方程开始感觉有点意思了。。。 今天又看看了对LIS的解决方案的描述,感觉貌似明白了,就试着写了写,只写了20行的代码就解决问题了,当然,这原创 2011-08-17 11:39:01 · 2003 阅读 · 0 评论 -
cugb 1050 拦截导弹 (最长不升子序列)
看了两天的书,然后,然后,然后稀里糊涂的就把第一道DP给做出来了。。。。让我再理一下思路。。 这道题的代码是求最大不升子序列的,与LIS相比就是差了个比较符号。。。。。具体解释我放在《LIS 最长不降子序列》那篇里。。。。 #include int main() {原创 2011-08-17 11:10:20 · 995 阅读 · 0 评论 -
九度1011 最大连续子序列和
给一序列,求最大连续子序列的和,以及这个序列的开始元素和最后一个元素,若都为负数,和为0,输出原序列第一个和最后一个元素 思路:d【i】存放以第i个元素为结束点的连续序列的和,d【0】=a【0】,顺推(动态规划思想),最后找出d中最大的即可; first【i】存放以第i个元素为结束点时,此序列的开始元素的下标; #include int a[10000],d[10000],fir原创 2013-09-21 18:14:10 · 1111 阅读 · 0 评论