摘要: 原题链接:点击此处 解题思路: 详情可见,算法竞赛入门经典(刘汝佳的那本紫书)第二版275页。 dp(i,j)表示的是A1,A2,A3....,Ai和B1,B2,B3...Bj的最长公共子序列(LCS)的长度。 当A[i]=B[i]时,dp(i,j)=d(i-1,j-1)+1; 否则dp(i,j)= 阅读全文
posted @ 2016-08-13 11:10 君子酱 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 原题链接:点击此处 解题思路: 题意是求哪一个区间中,数字相加的和最大,然后输出最大的和。很简单,直接暴力求出来: 将他们每个数都相加,如果为加的是负数,那么那个区间的和必然不是最大。 代码如下: #include <iostream> #include <stdio.h> using namesp 阅读全文
posted @ 2016-08-13 10:58 君子酱 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 原题链接:点击此处 解题思路: 多重背包问题,不太理解,理解了再补充。 网上博客的思路是: 对于每个硬币而言: IF 价值×数量>=m THEN 取这个硬币的次数相当于无限制,可以考虑成完全背包 ELSE THEN 考虑成0-1背包(二进制优化),就是把这个硬币的v和num组合出0-1背包可能出现的 阅读全文
posted @ 2016-08-13 10:45 君子酱 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 原题链接:点击此处 解题思路: 思路与01背包差不多,思路用二维数组表示: dp[i][v]=max{dp[i-1][v-k*b[i]]+k*a[i]|0<=k*b[i]<=v} 其dp(i,v)表示“把i个物体放进容量为j的包里”。 伪代码如下: for i=1..N for v=0..V f[v 阅读全文
posted @ 2016-08-13 10:29 君子酱 阅读(225) 评论(1) 推荐(0) 编辑