DP
文章平均质量分 62
qingniaofy
这个作者很懒,什么都没留下…
展开
-
poj 1163
数字三角形。递推计算。#include#define Max(a,b) ((a)>(b)?(a):(b))const int maxn=102;int a[maxn][maxn];int dp[maxn][maxn];int main(){ int n; int i,j; while(scanf("%d",&n)==1){ for(i=1;i<=n;i++){原创 2012-06-10 00:09:21 · 400 阅读 · 0 评论 -
poj 1837 dp+01背包
题意,给出 n 个 挂钩的位置 ,- 表示在左边,+ 表示在右边,再给出m 个 砝码,现在要求 有多少种方法 能使 天平 平衡思路,dp[i][j]表示挂 i 个砝码 力矩达到 j 的方法数,dp[i][j+hook[k]*val[i]]+=dp[i-1][j];也就是 dp[i][j]=sigma(dp[i-1][j-hook[k]*val[i]]);#include#include原创 2012-08-27 14:34:24 · 637 阅读 · 0 评论 -
poj 3267 动态规划
#include#includechar word[605][305],s[305];int f[305],len[605];//f[i]..前i个字符满足要求需要去掉的最少字符数,len记录单词长度 //f[i]=min{cnt[k,i]+s[k-1]},cnt[k,i]..从k到i匹配到某个单词需要去掉的最少字符数..int min,cnt,n,m,ps,pw;//ps..原创 2012-08-30 00:56:15 · 780 阅读 · 0 评论 -
poj 1160 Post Office
经典动态规划题目,俺真的是太菜 了,推了好久都没推出来,最后只好学习网上大神们的报告才过的。。dp[i][j]表示前 j 个村庄 建了i 个 邮局的最优解,cost[i][j]表示在i 和 j 之间 建立一个邮局 的最小代价,很明显,肯定是建在最中间的那个村庄的位置上。。那么我们可以得到 dp[i+1][j+k]=min{dp[i][j]+cost[j+1][j+k]} k+j原创 2012-08-19 16:12:00 · 1010 阅读 · 0 评论 -
poj 1742 多重背包
虽然说这题多重背包很明显,但是没有花一点时间是过不了的,TLE 了n次啊,一开始直接用 多重背包 做法直接上,结果T了,后来也看了一些别人的做法,真的是需要思考啊。。因为这题是判断最后 是否 符合条件,因此没必要 记录 最优结果,因此只要 利用 bool (int就 TLE,各种yy)记录是否 满足条件就可以了。在 01 背包中,dp[i]=dp[i]|dp[i-cost],表示i的状态要原创 2012-08-19 10:49:30 · 1986 阅读 · 0 评论 -
poj 1014 多重背包
很明显,这题是多重背包,参见背包九讲就可以做出来了,然后有个小问题就是 背包九讲上面的 伪代码 有点小问题,就是 进行二进制拆分的时候,while(kwhile(k#include#include#includeusing namespace std;const int maxn=20005;int cnt[7],V;int dp[maxn*3];void ZeroOne原创 2012-08-18 14:05:39 · 603 阅读 · 0 评论 -
poj 1157 DP
有n种花,m个花瓶,现在需要 把花插到花瓶里,但是花的顺序要保持不变,也就是 说 插入以后 还是要保持 1-n的顺序,中间可以空着,最后要求最大值,因为每种花插到每个花瓶的值不一样。。思路,dp[j][i]表示 前 i个花瓶已经插了 j种花,那么 dp[j][i]=max(dp[j][i-1],dp[j-1][i-1]+a[j][i]);注意初始化!!!#include#include原创 2012-08-17 00:32:29 · 609 阅读 · 0 评论 -
poj 1050
求最大子矩阵和,经典dp以前有看过别人的思路,知道要进行压缩,自己真的太弱了,不过有了思路就简单了,进行压缩之后,在进行最大子段和求解就可以了#include#include#define for if(0);else forconst int maxn=105;int map[maxn][maxn];int dp[maxn][maxn];int n;int DP(原创 2012-06-10 10:40:54 · 399 阅读 · 0 评论 -
poj 3356 最长公共子串变形
给两个串,可以通过 增加,删除 和 修改 三个操作 最后使 两个串 一样,求最小 操作数很明显,先求出 两个串 的 LCS,然后 用 小串的长度 - LCS的长度 (需要修改的)+ 两个串长度 差(需要增加的)。。#include#include#include#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)原创 2012-08-14 23:54:55 · 531 阅读 · 0 评论 -
poj 1080 最长公共子串变形
给出两个串,根据给出的字符之间的相似度 求 最大相似度。。很明显的 LCS变形,只要注意下 初始条件就可以了#include#include#define max(a,b,c) ((a)>(b)?(a)>(c)?(a):(c):(b)>(c)?(b):(c))const int maxn=105;char s[maxn],t[maxn];int dp[maxn][maxn];原创 2012-08-14 23:28:40 · 640 阅读 · 0 评论 -
poj 1631 最长上升子序列 nlogn
题目挺长的,就是说 一开始 有一些连线,左边1~n 跟右边 1~n 相连,现在要你 删除一些连线,使得剩下的连线最多,并且剩下的连线不相交。。其实就是求最长上升子序列;但是 n 的范围 是 40000,n^2 的算法是不行的,需要 nlogn的算法。算法分析,我们可以维护一个 c数组,这个c数组 保存的是 对长度 为 到目前为止最长上升子序列 最后 一个 值,同时这个值 是最小的,比如 最原创 2012-08-12 20:25:52 · 1408 阅读 · 0 评论 -
poj 2533 最长上升子序列
方法一,dp如果 a[i]>a[j] ,那么dp[i]=max(dp[i],dp[j]+1)#include#include#includeusing namespace std;const int maxn=1005;int dp[maxn],a[maxn];int main(){ int n; while(scanf("%d",&n)==1){ for(int原创 2012-08-12 18:47:14 · 1129 阅读 · 0 评论 -
poj 2192 记忆化&dfs
给三个串,问 第三个串能否 由前两个串构成。。dfs+剪枝。。#include#include#include#includeusing namespace std;const int maxn=210;char sa[maxn],sb[maxn],p[maxn<<1];//int dp[maxn][maxn];int lena,lenb,lenp;bool dfs(原创 2012-08-13 10:17:19 · 589 阅读 · 0 评论 -
poj 1887 最长下降子序列
dp,和求 LIS一样#include#include#includeusing namespace std;const int maxn=100005;int dp[maxn],a[maxn];int main(){ int n; int cas=0; while(scanf("%d",&a[0])&&a[0]!=-1){ n=0; while(a[n]!=-1原创 2012-08-12 19:03:37 · 756 阅读 · 0 评论 -
poj 2250 最长公共子序列
记录路径的最长公共子序列。。简单dp,开一个pre数组记录路径,由于 dp[i][j]只能有三种状态推过来,即dp[i-1][j-1],dp[i][j-1],dp[i-1][j],那么我们可以将pre[i][j]分别设为 0 1 2 ,最后只要递归扫一遍就可以了。。#include#include#include#includeusing namespace std;原创 2012-08-12 13:01:43 · 792 阅读 · 0 评论 -
poj 1088 动态规划
简单动态规划。采用记忆化搜索,对每个点 进行上下左右 的求解,该点 的最大值 肯定是 从 四个方向 中最大 的 +1#include#include#include#includeusing namespace std;const int maxn=105;int map[maxn][maxn];int dp[maxn][maxn];int dx[]={-1,0,1,原创 2012-08-10 23:13:01 · 629 阅读 · 0 评论 -
poj 1458 求公共子串长度
简单dp,串 s 和 串 t 。dp[i][j]表示 串s 的前i个字符 和 串 t 前j 个字符 中 公共的长度,那么 分析可得,如果 s[i]==t[j],那么dp[i+1][j+1]=dp[i][j]+1;如果 s[i]!=t[j],那么 dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1])。。#include#include#includeu原创 2012-08-11 01:19:06 · 559 阅读 · 0 评论 -
poj 1953
简单动态规划分析可得,每一位可以有两种状态,0 或者 1,dp[i][0]=dp[i-1][0]+dp[i-1][1],表示 第i位如果 取0 ,那么他的前一位 可以是任意的dp[i][1]=dp[i-1][0],表示,第i位如果取1 ,那么他的前一位 必须是 0#include#include#include#includeusing namespace std;原创 2012-08-10 23:38:07 · 586 阅读 · 0 评论 -
poj 1159 回文串问题
给一个串,问最少添加几个字符使得 该串 变成回文串,dp。。dp[i][j]表示 i j 的范围内需要添加几个字符,如果 s[i]==s[j],那么 dp[i][j]=dp[i+1][j-1];否则 ,dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1ps: 用short水过,int MLE 啊 啊啊啊。。#include#include#inc原创 2012-08-14 01:15:34 · 1293 阅读 · 0 评论