![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
简单DP
youthinkwu
这个作者很懒,什么都没留下…
展开
-
HDU 1248 寒冰王座
只有3个物品,商人不补钱,想要损失最小,那就尽可能的把钱用完,即背包尽量装满。这里是完全背包。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[10010],cost[3]={150,200,350};int main(){ i原创 2015-02-17 20:03:29 · 257 阅读 · 0 评论 -
HDU 1159 || HOJ 1227 Common Subsequence
题意:求最长公共子序列的长。dp一波。#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>using namespace std;int dp[1000][1000];char a[1000],b[1000];int main(){ while(~scanf("%s %s",a,b原创 2015-02-17 18:52:00 · 266 阅读 · 0 评论 -
CodeForces 433A Kitahara Haruki's Gift
题目大意:有N个苹果,给出苹果质量,问是否能平均分成两份。 做法:01背包#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[20010],a[110];int main(){ int n ,sum = 0; scanf原创 2015-02-18 17:09:23 · 384 阅读 · 2 评论 -
HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
多重背包#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>const int maxn = 100000;using namespace std;int c[maxn],v[maxn],dp[maxn],n1[maxn],V;void ZeroOnepack(int c,int v){原创 2015-02-18 15:58:30 · 441 阅读 · 0 评论 -
POJ 2955 Robberies
小偷偷银行的钱,给出每个银行能偷到的钱和被抓的概率,这题还是01背包,背包装的内容是不被抓的概率的最大值。从后往前扫找到最大的V使得dp[i]>p就是答案了。#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct point{ int原创 2015-02-18 11:10:10 · 210 阅读 · 0 评论 -
UVA 10684 || HOJ 1760 The jackpot
这题是要求最大子序列和。在这一遍扫描数组当中,从左到右记录当前子序列的和dp[i],若这个和不断增加,那么最大子序列的和max1也不断增加(不断更新max)。如果往前扫描中遇到负数,那么当前子序列的和将会减小。此时dp[i] 将会小于max1,当然max1也就不更新。如果dp[i]降到0时,说明前面已经扫描的那一段就可以抛弃了,这时将dp[i]赋值为a[i]。然后,dp[i]将从后面开始将这个子段进原创 2015-02-17 20:25:27 · 284 阅读 · 0 评论 -
HOJ 1485 A Good Helper
题意:两个人要搬寝室,两个人都有自己的承受能力A和c,他们有N件物品,如果他们能自己把东西搬完就输出Yes,如果不行,他们可以请一个帮手,一个帮手只能帮拿一件任意重量的物品,但是只能请一个。如果请一个帮手能把东西搬完,输出Need a helper,否则输出No。 做法:排序,然后对前n-1件物品01背包。最后分组讨论。#include <iostream>#include <cstring>原创 2015-02-18 15:53:11 · 350 阅读 · 0 评论 -
POJ 1276 Cash Machine
多重背包#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>const int maxn = 100010;using namespace std;int c[maxn],v[maxn],dp[maxn],n1[maxn],V;void ZeroOnepack(int c,int v)//0原创 2015-02-18 15:08:34 · 201 阅读 · 0 评论 -
HDU 1257 最少拦截系统
裸的最长上升子序列题#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>int a[10000],dp[10000];using namespace std;int main(){ int n ; while(~scanf("%d",&n)) { me原创 2015-02-17 21:39:33 · 175 阅读 · 0 评论 -
HDU 1203 I NEED A OFFER!
求至少获得一份工作的概率,可以求它的对立面,一份都得不到的概率。然后再用1减去它。这里的做法是01背包。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;struct P{ int monney; double p;};double原创 2015-02-17 21:35:49 · 193 阅读 · 0 评论 -
POJ 3211 Washing Clothes
题目大意:两个人洗衣服,有很多种颜色的衣服,给出衣服的颜色和消耗。两个人洗衣服的方法很奇怪,同时洗同一种颜色的衣服,当两人都洗完同一种颜色的衣服时才开始洗下一种颜色的衣服。求最短的时间。 做法:分组01背包,对每种颜色分别做01背包然后相加。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#原创 2015-02-18 15:29:14 · 260 阅读 · 0 评论 -
120. Triangle LeetCode
题意:给出一个数字三角形,求一条从三角形头部到底部的路径,是的路径上的数字加和最小。 题解:dp,dp[i][j] 表示从0,0走到i行j列的时候最小数字和。转移方程: dp[i][j] = min(dp[i - 1][j],dp[i - 1][j - 1]) + triangle[i][j].省空间的话可以不用额外开dp数组,直接用triangle来dp就可以。class Solution {原创 2016-03-07 22:30:26 · 213 阅读 · 0 评论 -
322. Coin Change LeetCode
题意:给出硬币的种类和要换的钱,最少可以用多少个硬币去换,不能返回-1。 题解:dp,类似背包的dp,dp[i]表示换成i元的时候最少要多少个硬币。 dp[v] = min(dp[v],dp[v -coins[i]] + 1);class Solution {public: int coinChange(vector<int>& coins, int amount) {原创 2016-03-16 18:19:47 · 180 阅读 · 0 评论 -
279. Perfect Squares LeetCode
题意:求n能最少能由多少个完全平方数组成。 提交:dp,dp[i]表示i这个数字最少能由多少个完全平方数组成。转移: dp[i] = i(由i个1组成), dp[i] = min(dp[i],dp[i - j * j])( 0<= j <= sqrt(i));class Solution {public: int numSquares(int n) { int dp[n原创 2016-02-16 19:10:05 · 245 阅读 · 0 评论 -
64. Minimum Path Sum LeetCode
题意:给出一个NxM的矩阵,每个格子有一个非负数,从左上角走到右下角,每次只能往下或者往右走一格,求一条路径,使得走过的格子数字之和最小。 题解:dp。dp[i][j] 表示从0,0走到i行j列这个格子的最小数字和。 dp[i][j] = min(dp[i - 1][j],dp[i][j - 1]) + num[i][j].class Solution {public: int min原创 2016-02-14 18:48:06 · 221 阅读 · 0 评论 -
121. Best Time to Buy and Sell Stock LeetCode
题意:给出每天股票的价格,只能进行一次交易,求最大收益。 题解:DP,minprice表示1…到i天价格最低的股票,maxprice表示1…i天最大收益。maxprice = max(maxprice,price[i] - minprice).class Solution {public: int maxProfit(vector<int>& prices) { int原创 2016-02-14 18:41:22 · 205 阅读 · 0 评论 -
62. Unique Paths LeetCode
题意:给出一个NxM的矩阵,一个人从左上角出发走到右下角,每次只能往右或者往下移动一格,问有多少种不同的走法。 题解:dp , dp[i][j]代表从0,0走到行为i列为j的格子的方案数。转移: dp[i][j] = dp[i - 1][j] + dp[i ][j - 1].class Solution {public: int uniquePaths(int m, int n) {原创 2016-02-14 18:37:18 · 198 阅读 · 0 评论 -
309. Best Time to Buy and Sell Stock with Cooldown LeetCode
题意:给出每天股票的价格,每次卖出股票之后得隔一天才能再买入,求最大收益。 题解:dp,buy[i]表示第i天买入股票得到的最大收益,sell[i]表示第i天卖出股票得到的最大收益。答案是sell[n]。转移:buy[i] = max(buy[i - 1],sell[i - 2] - prices[i]). sell[i] = max(sell[i - 1],buy[i - 1] + prices原创 2016-02-14 18:34:05 · 228 阅读 · 0 评论 -
UVA 147 Dollars
跟UVA 674 Coin Change是一样的。都是换钱方法。这里有11种货币。dp[i]表示i元的组合方案数,涉及到浮点数,这里会被浮点数误差卡死。WA了无限次。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;long long dp[30010]原创 2015-02-18 19:18:35 · 278 阅读 · 0 评论 -
HDU 2602 Bone Collector
很多种骨头,每个骨头都有体积和价值,要怎么拿才能使得拿到的价值最大。很明显01背包。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[1010],value[1010],w[1010];int main(){ int t;原创 2015-02-17 20:08:48 · 194 阅读 · 0 评论 -
ZOJ 1853 || HOJ 1388 The Brick Stops Here
题意:给出N块以及他们的含铜量和价格,要选购K块砖,使得平均含铜量在一个范围内,求最小代价。 f[i][j][k]如果要降第一维,那么第二维要变成倒序,第三维可以不变这个跟01背包f[i][j]降了第一维之后j要倒序是一个道理。这样才能做到物品不重复放置。而完全背包要顺序放就是因为东西可以重复放。01背包跟完全背包差别就在这里。#include <iostream>#include <cstri原创 2015-02-17 18:45:47 · 296 阅读 · 0 评论 -
01背包、完全背包、多重背包模版。
01背包模版int c[maxn],v[maxn],dp[maxn],n1[maxn],V;void ZeroOnepack(int c,int v)//01背包{ for(int i = V ; i >= c ; i--) dp[i] = max(dp[i],dp[i-c]+v);}完全背包模版int c[maxn],v[maxn],dp[maxn],n1[maxn]原创 2015-02-18 14:09:50 · 225 阅读 · 0 评论 -
UVALive 3387 || HOJ 2196 Job Scheduling by Open Bidding
01背包#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int N,V,a[520];double dp[2010],b[520];void back(){ memset(dp,0,sizeof(dp)); scanf("%d",&N); for(int i=1;i<原创 2015-02-17 19:56:38 · 446 阅读 · 0 评论 -
HDU 1114 || HOJ 1031 Piggy-Bank
题目大意,给你pig的质量和装满钱的pig的质量,再给出N种货币的面值和重量,求pig里可能装的钱的最小值是多少。 这个是完全背包。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>struct monney{ int p,w;};int dp[10010];monney a[原创 2015-02-17 18:31:02 · 287 阅读 · 0 评论 -
UVA 10405 Longest Common Subsequence
这题是最长公共子序列,主要卡点在字符会出现空格,读入方法稍微注意一下。我用gets来解决。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[1100][1100];int main(){ char s1[1010],s2[101原创 2015-02-18 19:08:09 · 216 阅读 · 0 评论 -
HDU 1513 Palindrome
给出一个字符串,问你需要加多少个字符可以使得这个字符串变成回文字符串。一开始就猜到了,答案等于字符串长度-字符串和逆序字符串的最长公共子序列;开了一个dp[5000][5000] 直接MLE。要用滚动碉数组。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std原创 2015-02-18 15:36:25 · 225 阅读 · 0 评论 -
POJ 1742 Coins
有n种硬币,给出他们的价值和数量。总价值不会超过m,问可以组成多少种价值(不是所有的硬币都得用上)。 做法:dp,dp[j] = 1代表能组合成价值为j的情况。user[j]表示组合成价值j用的同种硬币的数量。#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>bool dp[100010];原创 2015-02-18 14:52:56 · 307 阅读 · 0 评论 -
HDU 3496 Watch The Movie
题意:多多要看电影,然后叔叔规定只允许看L这么长的时间,多多想看的碟子有N张,商店卖且只卖M张碟子,每个碟子有播放时间和价值,求在L内最大的价值。 做法:背包小变形。dp[i][j],表示买i张碟子在j时间内的最大价值。 方程:dp[j][k] = max (dp[j-1][k-a[i].t]+a[i].v,dp[j][k]);#include <iostream>#include <cstr原创 2015-02-18 14:00:51 · 189 阅读 · 0 评论 -
HDU 1677 Nested Dolls
俄罗斯套娃,套娃有高和宽,可以套在一起,要使套娃个数尽量少。 做法:对宽和高进行排序然后转化成最长不下降子序列问题。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;struct p{ int w,h;};p a[20010];int原创 2015-02-17 21:21:02 · 221 阅读 · 0 评论 -
HDU 1087 Super Jumping! Jumping! Jumping!
这是求上升子序列最大和,dp[i]代表长度为i时的上升序列的和。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int a[1010],dp[1010];int main(){ int n; while(~scanf("%d",&n原创 2015-02-17 20:55:14 · 178 阅读 · 0 评论 -
UVA 674 Coin Change
有5种货币,1,5,10,25,50.给出钱的总数,问有多少种组成方案。 解法:DP,dp[i]表示能换到i元的方法总数。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[7500];int a[5] = {1,5,10,25,50};原创 2015-02-18 19:13:18 · 169 阅读 · 0 评论 -
POJ 1014 Dividing
有6件物品,价值分别是1,2,3,4,5,6。给出每件物品的数量,判断能不能将物品分成两份使得两份总价值价值相同。 做法:多重背包#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>const int maxn = 100000;using namespace std;int c[maxn]原创 2015-02-18 14:32:43 · 226 阅读 · 0 评论 -
HDU 1025 Constructing Roads In JGShining's Kingdom
这题就是最长上升子序列.两个序列存在结构体里,先按第一关键字排序。然后对第二关键字求最长上升子序列。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;struct P{ int x,y;};bool comp(P a, P b){原创 2015-02-17 20:34:53 · 178 阅读 · 0 评论 -
URAL 1244 Gentlemen
给出扑克丢失后的总重量,给出几张扑克的编号和它们的重量,让你指出丢失了哪几张扑克。如果无解输出0,多种丢失方式输出-1,只有一种丢失方式则输出丢失的牌的编号。 方法:dp[i]表示重量为i的组合方式总数,如果dp[v] == 0 则无解。如果等于1,则只有一种组合方式,否则,多种解。dp[v] == 1的时候需要输出编号,开一个前驱数组记录一下。#include <iostream>#inclu原创 2015-02-19 00:35:25 · 239 阅读 · 0 评论 -
UVA 10066 The Twin Towers
最长公共子序列。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int dp[110][110],a[110],b[110];int main(){ int n ,m , cas = 1; while(~scanf("%d%d",&原创 2015-02-18 17:15:29 · 226 阅读 · 0 评论 -
POJ 2392 Space Elevator
题意:帮牛建宇宙电梯,现在有很多种砖块,每种砖都有自己的高度和高度上限以及数量,高度上限是说这种砖不能搭在高于这个高度的地方。现在要求能达到的最大高度。 做法:dp,跟POJ1742做法很像。 dp[j] = 1 代表高度j能拼成,user[j]用来存到达j高度时某同种砖块使用的数量。高度上限小的放在下面,所以对高度上限排序,再DP。#include <iostream>#include <c原创 2015-02-18 15:04:05 · 186 阅读 · 0 评论 -
HDU 1171 Big Event in HDU
裸的完全背包。#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>const int maxn = 100000;using namespace std;int c[maxn],v[maxn],dp[maxn],n1[maxn],V;void ZeroOnepack(int c,int v)原创 2015-02-18 14:17:30 · 171 阅读 · 0 评论 -
HDU 1950 || HOJ 1288 Bridging Signals
题目很长,其实就是最长上升子序列!看懂了就好。dp一波吧。这题不能用n^2的方法,会超时,用nlogn的才行。dp[i] = j 代表长度为i的上升子序列的最小数字为j。 贴两个代码,一个是亮神的做法,一个是自己的。感觉亮神的比较好。 亮神代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>原创 2015-02-17 19:34:15 · 541 阅读 · 0 评论 -
FZU 1004 || HOJ 1058 Number Triangles
数字三角形,题意:三角形区域,每个点有个数值,每个点只能往自己的下方或者右下方,从三角形顶部走到底部,有一或多种走法使得路过的数字之和最大,求这个最大值。 解法:动态规划入门题,这是最简单的DP题了。 状态方程dp[i][j] = max(dp[i-1][j]+a[i][j],dp[i-1][j-1]+a[i][j])#include <iostream>#include <cstring>原创 2015-02-17 18:14:10 · 319 阅读 · 0 评论 -
63. Unique Paths II LeetCode
题意:给出一个01矩阵,1表示所在格子不能通过,求从0,0走到n,m的不同方案数。 题解:DP,dp[i][j]表示从0,0走到i,j的方案数。转移:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],在左边和上边的格子都为1的情况下。不然就哪里为0从哪里转移。注意初始化。class Solution {public: int uniquePathsWithOb原创 2016-03-07 22:35:17 · 182 阅读 · 0 评论