![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
呆呆与笨笨
梦想是被追逐的,而不是幻想的
展开
-
hdu 1003 Max Sum
这就是一个很简单的DP思想,状态转移方程为f[i]=max(f[i-1]+a[i],a[i])。#include#includeint main(){ int num[100010],s; int n,m,i,max,a,end,begin,t; scanf("%d",&n); for(t=1;t<=n;t++) { scanf("原创 2014-01-03 22:42:57 · 455 阅读 · 0 评论 -
hdu 1087 Super Jumping! Jumping! Jumping!
类似最长递增子序列的想法,只不过这里求的是到第i个元素时,最长递增子序列,各个元素的和。求最大的那个值zhuantai原创 2014-05-14 22:27:45 · 434 阅读 · 0 评论 -
hdu 4508 湫湫系列故事——减肥记I
完全背包#include#includeint dp[100010];int max(int a,int b){ return a>b?a:b;}int main(){ int w[110],v[110]; int n,m,i,j; while(~scanf("%d",&n)){ memset(dp,0,sizeof(dp)); for(i=0;i<n;i++){原创 2014-05-20 20:39:15 · 474 阅读 · 0 评论 -
hdu 1248 寒冰王座
完全背包#include#includeint dp[10010];int max(int a,int b){ return a>b?a:b;}int main(){ int t,i,j,n; int w[]={150,200,350};//代表重量 int v[]={150,200,350};//代表价值 scanf("%d",&t); while(t--){原创 2014-05-20 20:25:37 · 421 阅读 · 0 评论 -
poj 1276 Cash Machine(多重背包)
多重背包详解:http://blog.csdn.net/lyhvoyage/article/details/8545852原创 2014-08-01 20:04:14 · 394 阅读 · 0 评论 -
hdu 1171 Big Event in HDU(01背包&多重背包)
题意:说的是杭电以前分家的时候,财产要尽可能的均匀分给两个兄弟。现在告诉你价值为n的物品有m件,你的任务就是把这些东西尽可能的分成两份。然后输出最后每家分的的财产总和。最大的总在最前面········原创 2014-08-02 11:06:10 · 404 阅读 · 0 评论 -
poj 3628 Bookshelf 2(01背包)
题意: 给出n个数, 要求出它们之中一部的和sum, 求出sum-S最小值.原创 2014-08-01 21:24:53 · 397 阅读 · 0 评论 -
poj 1088 滑雪(DP+记忆化dfs)
思路:这道题的动态方程是比较容易想的。就是说拿当前点的高度和该点四周的高度相比,若比周围点高度高,则比较长度。dp[i][j] = max(dp[i][j],dp[newx][newy]+1),这样即可。在比较的时候用到了深搜找路径。原创 2014-08-04 20:41:37 · 423 阅读 · 0 评论 -
poj 1458 Common Subsequence(LCS)
//滚动数组写的,防止超内存 #include#include#includeusing namespace std;int dp[2][1010];//dp[i][j]大小之于dp[i-1][j]有关 char s[1010],str[1010];int lcs(int n,int m){ int i,j; for(i=1;i<=n;i++){ for(j=1;j<=m;j原创 2014-08-04 16:17:26 · 384 阅读 · 0 评论 -
poj 2184 Cow Exhibition(处理负数的01背包)
今天遇到一题poj2184,大概思路是01背包dp之后把符合要求的最优解统计出来。但是在解01背包的时候遇到一个问题是体积有负数,这样在dp的过程中会遇到两个问题:循环的时候超出体积的范围;压缩空间的时候状态转移方程:dp[v]=max(dp[v],dp[v-c[i]]+w[i]),c[i]为负数时v-c[i]>v,这样按一般的循环的方向从大到下会重复计算。先看第二个问题,在一般的01背包原创 2014-08-05 21:54:13 · 506 阅读 · 0 评论 -
hdu 1799 循环多少次(DP,排列组合Cn(m))
抽象出来是排列组合题目从n个数里面选择m个数、按递增方式放在每一层循环郁闷、高中的公式都忘了 Cn(m)=C(n-1)(m-1)+C(n-1)(m)DP状态转移方程:原创 2014-07-31 10:23:13 · 822 阅读 · 0 评论 -
hdu 1058 Humble Numbers(DP)
题意:一组只因子只含有2,3,5,7的数据从小到大排列,求出第n个数解题思路:1.此题为动态规划,难点在于如何将数据从小到大放在数组中2.各个因子逐渐增加相乘,再比较大小得出数组3.注意输出格式,除了11,12,13例外,其余格式余数1为st,2为nd,3为rd,其余为th原创 2014-07-31 17:58:28 · 397 阅读 · 0 评论 -
poj 3624 Charm Bracelet(01背包)
#include#include#include#includeusing namespace std;int dp[13000],w[4000],v[4000];void BeiBao(int n,int m){ int i,j; for(i=0;i<n;i++){ for(j=m;j>=w[i];j--){ dp[j]=max(dp[j],dp[j-w[i]]+v[i原创 2014-08-01 10:17:15 · 412 阅读 · 0 评论 -
01背包问题
背包问题(空间优化)经典代码题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[i][v]=max{f[转载 2014-03-08 19:45:48 · 685 阅读 · 0 评论 -
hdu 1267 下沙的沙子有几粒?(递推&DP)
根据题目输入的是 H 和 D 的个数,用a [ i ] [ j ]代表有i个 H 和j个 D 的序列的种数。考虑最后一个字母是 H 还是 D 的情况,最后一个字母是 D 的情况的序列种数是a [ i ][ j-1 ],最后一个字母是 H 的情况的序列种数是a [ i-1 ][ j ]。则 :a [ i ][ j ] = a [ i-1 ][ j ] + a [ i ][ j-1 ];原创 2014-08-02 09:43:04 · 660 阅读 · 0 评论 -
南阳 1042 Tamama的排序游戏(最长上升子序列LIS)
#include #include #include #include using namespace std;int num[1010],arr[1010],len;int Bse(int i){//二分查找 int l=0,r=len,mid; while(l<r){ mid=l+(r-l)/2; if(arr[mid]>num[i]原创 2014-08-12 21:43:38 · 708 阅读 · 0 评论 -
hdu 1559 最大子矩阵
子矩阵的问题,都可以转化成最大子段和的问题,转换的思想就是把几行合并成一行,求这一行的最大子段和,结果就是子矩阵的最大和了。原创 2014-04-13 11:13:09 · 450 阅读 · 0 评论 -
南阳 249 最大长方形
和“积木”差不多原创 2014-05-03 09:46:04 · 474 阅读 · 0 评论 -
南阳 265 积木
#include#include#includeint hight[100],lengh[100];int Max(int i,int j){ int t=-1; for(j+=1;j<=i;j++){ if(hight[j]>t) t=hight[j]; } return t;}int main(){ i原创 2014-05-03 09:20:20 · 658 阅读 · 0 评论 -
hdu 1257 最少拦截系统
#include#includeint main(){ int num[30010],con[30010]; int n,i,j,t; while(scanf("%d",&n),n!=-1) { memset(num,0,sizeof(num)); memset(con,0,sizeof(con));原创 2014-01-03 22:28:41 · 454 阅读 · 0 评论 -
南阳 删除元素
#include#include#includeint cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int num[100010];int main(){ int n,i,k,s,t,j; while(scanf("%d",&n)!=EOF) {原创 2014-01-03 22:27:20 · 449 阅读 · 0 评论 -
hdu 2084 数塔
解题分析:此题采用动态规划从自底向上计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后排数其中一个,向上退,倒数第二步肯定走最后排数对应的倒数第二排最大的一个(将最后对应最后步走的最大的数加起来存在倒数第二步的数组中:不理解的话先看思路在看程序),再向上推,一直推到最上面的第0步,那么num[0][0]最后所存的结果一定是最大的; #include#includeint num[1原创 2014-01-03 22:34:39 · 426 阅读 · 0 评论 -
hdu 1231 最长子序类
状态转移方程:m = m > 0 ? m + num[i] : num[i] ; 第一个m是前i个数的和,后面的两个m是前(i-1)个是的和;如果i前面的和是小于0的,那么加上第i个数肯定比i要小,所以只取第i个数即num[i],如果是大于0的,则就加上。#include#includeint main(){ int num[10010]; int n,m,i,j; int sum,mi原创 2014-02-23 17:08:50 · 578 阅读 · 0 评论 -
hdu 2602 Bone Collector
01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。Pi表示第i件物品的价值。决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ?原创 2014-03-08 19:40:09 · 476 阅读 · 0 评论 -
hdu 2546 饭卡
#include#include#includeint dp[1010][1010],val[1010];int max(int a,int b){ return a>b?a:b;}int cmp(const void *a,const void *b){ return *(int *)a-*(int *)b;}int main(){ i原创 2014-03-09 09:41:51 · 526 阅读 · 0 评论 -
九度 1527 首尾相连数组的最大子数组和
思路:问题的解可以分为两种情况:1)解没有跨过A[n-1]到A[0],即普通的求子数组和的最大值2)解跨过A[n-1]到A[0]对第二种情况,只要找到从A[0]开始和最大的一段(A[0],...,A[j])(0M_2=A[i]+...A[n-1]+A[0]+...+A[j]如果iM_2=A[0]+...+A[n-1] - 子数组和为负的最小值(数组元素全为正则返回0原创 2014-03-10 11:04:20 · 617 阅读 · 0 评论 -
九度 1550 分糖果
#include#includeint num[100100],f[100100];int main(){ int n,i,s; while(~scanf("%d",&n)){ memset(num,0,sizeof(num)); for(i=0;i<n;i++){ scanf("%d",&num[i])原创 2014-03-10 11:16:53 · 631 阅读 · 0 评论 -
hdu 2955 Robberies
这是一道背包题,需要转化一下。这个小偷想偷银行的钱,给你被抓的最大概率,和N家银行。下面N行代表的是这家银行都多少钱,和被抓的最大概率。有这时候我们关键的是怎么写出动态方程出来: 我们学习的10背包是两种方面构成的,一是背包的最大体积,二是装入背包物品的价值和体积。我们来模拟这个过程,首先:将全部银行的钱当做背包的最大体积那么每家银行的钱则当做物品的体积那么被抓的概原创 2014-03-09 11:39:46 · 462 阅读 · 0 评论 -
hdu 1203 I NEED A OFFER!
题目要求的是至少收到一份Offer的最大概率,我们算出得不到的最小概率即可,状态转移方程:dp[j]=min(dp[j],dp[j-val[i]]*(1-p[i]));其中,p[i]表示得到的概率,(1-dp[j])为花费j元得到Offer的最大概率 #includeint w[10010];double dp[10010], p[10010];int main(){ in原创 2014-03-09 15:55:44 · 516 阅读 · 0 评论 -
hdu 1081 To The Max
把二维的子矩阵转化为求一维的原创 2014-04-13 17:04:15 · 400 阅读 · 0 评论 -
南阳 79 拦截导弹
最长单调递增子序列(LIS)#include#includeint num[100],arr[100],len;int BSE(int i){ int l=0,r=len,mid; while(l<r){ mid=l+(r-l)/2; if(arr[mid]>=num[i]){ r=mid-1;原创 2014-03-18 22:03:40 · 691 阅读 · 0 评论 -
hdu 1159 Common Subsequence
算法:最长公共子序列(LCS)状态转移方程:当 i = 0 , j = 0 时 , c[i][j] = 0当 i , j > 0 ; xi = yi 时 , c[i][j] = c[i-1][j-1] + 1当 i , j > 0 ; xi != yi 时 , c[i][j] = max { c[i][j-1] , c[i-1][j] }#include#include原创 2014-03-18 17:42:45 · 426 阅读 · 0 评论 -
最长上升子序列(LIS)长度的O(nlogn)算法 .
hdu 1950 Bridging signalshttp://acm.hdu.edu.cn/showproblem.php?pid=1950===================================最长上升子序列(LIS)的典型变形,熟悉的n^2的动归会超时。LIS问题可以优化为nlogn的算法。定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序转载 2014-03-18 22:06:46 · 745 阅读 · 0 评论 -
南阳 49 开心的小明
#include#includeint dp[30010];int max(int a,int b){ return a>b?a:b;}int main(){ int t,n,m,i,j; int num[30],val[30]; scanf("%d",&t); while(t--){ memset(dp,0,原创 2014-03-19 21:26:22 · 618 阅读 · 0 评论 -
九度 1077最大序列和(DP)
题目 解题思路: 状态转移方程:f[i]=max(f[i-1]+a[i],a[i])。 注意事项:数据都是 long long 型的#include<iostream>#include<cstdio>#include<cstring>#include<string>using namespace std;long long num[1000010];int main(){原创 2015-03-28 09:38:11 · 382 阅读 · 0 评论