
dp
Forward in time
永不停止前进
展开
-
Make The Fence Great Again CodeForces - 1221D(dp|类比01背包)
题意:题目要求对n个数中的某些进行任意多次的+1操作,使得对于每个元素(除开第一个)有a[i-1]!=a[i],1<i<=n,由于每个a[i]对应一个b[i],没增加1,那么费用就相应增加1*b[i],问使得在修改为满足条件a[i-1]!=a[i]的情况下最小的费用;这个题我也是看了题解才明白的,由于每次增加1,所以最多一个元素可以增加2次1就能保证左相邻是不想等的了;比如一个序...原创 2020-02-16 11:41:37 · 219 阅读 · 0 评论 -
Dima and Salad CodeForces - 366C(01背包,刚好装满的最大价值|不超过总容量为W的最大价值)
板子题:只不过这个板子比书上的更好;题意:在n个水果中选取m个出来,每次只能选一个,使得a的和最大,所以这是一个01背包问题;可以这样变一下形式然后把0看做背包容量,ai-k*bi看做重量,ai看作价值;所以就是一个01背包,但是由于有负数的产生,所以需要扩大背包容量;具体代码:#include<bits/stdc++.h>using namespace std;co...原创 2020-02-15 22:19:57 · 1156 阅读 · 0 评论 -
P1192 台阶问题(dp|递推式)
以前我一直不知道怎么写这道题,现在明白了;其实可以这样考虑,比如:k=2如果我在第i个阶梯上面,那么我的上一个阶梯就只能是i-1,i-2这两个阶梯,所以方案总数就应该是F[i]=F[i-1]+F[i-2];F[i]这里代表到达i阶梯的方案总数;所以按照这个思路我们就可以推出这个一个公式:F[i]=F[i-1]+F[i-2]+F[i-3]+…+F[i-k];所以整合一下就应该是这种:我这...原创 2020-02-06 18:09:27 · 730 阅读 · 2 评论 -
Eating Together(最长递增子序列和最长递减子序列(基础dp))
这道题,我又把基础dp复习了一遍,因为我的dp太弱了。首先把题读懂,最关键的就是都为单增或单减,所以明摆着求著名问题最长上升子序列和最长下降子序列,然后比大小就出来了!但是我当时用的是两个o(n^2)的时间复杂度去求的dp,结果发现还有lower_bound();这样时间复杂度就下降到了;所以求最长递增我用的lower_bound,递减我用的基础dp求的:我自己还得复习一下基础dp:...原创 2019-07-24 13:59:03 · 843 阅读 · 0 评论 -
01背包问题(dp)
这道题需要从定义去理解:dp【i+1】【j】定义为:在前i个物品里面选出来的总体积不大于j的最大的价值;所以这样就可以知道了,dp【i+1】【j】就表示在前i个物体里面选出来的不超过给定体积的最大价值了;所以清楚定义后就有:如果当前超过了当前体积了;那么他肯定就是dp【i+1】【j】=dp【i】【j】了;如果没有超过那么就应该是 dp【i+1】【j】=max(dp【i】【j】,dp【i+1...原创 2019-08-15 15:02:16 · 168 阅读 · 0 评论 -
最长上升子序列(dp)
这道题的dp定义为:dp【i】以a[i]结尾的最长上升子序列;因为自己的最长上升为1也就是只有自己所以dp[i]=1;然后枚举i之前的,每次记录以a[i]结尾的最长上升子序列:dp[i]=max(1,dp[j]+1);//因为只要i前面出现了上升那么就是+1;#include<iostream>#include<algorithm>using namespac...原创 2019-08-15 15:16:01 · 148 阅读 · 0 评论 -
合唱队形(基础dp,最长上升子序列)
这道题我感觉以前好像我遇见过,嘻嘻;这个可以直接求以这个数的左右两边的最长上升子序列中元素的个数,然后用n-(个数-1),每次取最小值就行了;对于最长子序列的dp定义:dp[i]=max(dp[i],dp[j]+1);其中dp[i]初始化都为1,因为自己本身就算一个;然后j是0<j<i的元素下标,因为遇见一个就需要+1;所以dp定义就这样了;因为数据很小,所以直接扫一遍就行;AC...原创 2019-08-30 20:01:42 · 505 阅读 · 0 评论 -
C. Dawn-K's water(多重背包dp(板子)+修改枚举)
题意:给你n种类型的矿泉水,然后每种的价格+重量,求在重量大于m的情况下最小价值;其实我一读题,又是dp,然后我想套白书模板,但是发现这个东东,行不通的哇;因为白书模板含义:void solve(){ dp[0]=0; for(int i=0;i<n;i++){ for(int j=w[i];j<=W;j++){//这里是从w[i]开始的 dp[j...原创 2019-09-14 17:23:25 · 298 阅读 · 0 评论