dp
czyhbo
这个作者很懒,什么都没留下…
展开
-
十一届山东省赛补题_H(二维费用背包)
newcode三维:要从头跑到尾,才能把整个dp更新完整,不然dp更新不完整#include<bits/stdc++.h>#define ll long longusing namespace std;int n,H,S;ll h[1010],s[1010],w[1010];ll dp[1005][305][305];int main(){ ios_base::sync_with_stdio(0); cin.tie(0),cout.tie(0); cin原创 2021-08-01 10:40:14 · 82 阅读 · 0 评论 -
2021-07-30
长沙理工H//总的是DP的思想,前一遍dp,后一遍dp,然后枚举中间点得到最大值#include<bits/stdc++.h>#define ll long long#define inf 0x3f3f3f3f //int#define linf 0xffffffffff // long longusing namespace std;const int N=2e5+100;int n,k;ll a[N],pre[N],f1[N],f2[N];int main(){.原创 2021-07-30 15:27:55 · 84 阅读 · 0 评论 -
完全背包
一、引入二、一维解法(推荐解法)const int maxn=5E4+100;int C[maxn],W[maxn];//花费 价值int dp[maxn*4];int V;int main(){ int n; cin>>n>>V; for(int i=1;i<=n;i++) { cin>>C[i]>>W[i]; } memset(dp,0,sizeof(dp));原创 2021-03-28 21:14:05 · 70 阅读 · 0 评论 -
HDU1284 硬币转换
题目链接dp[j] 表示使用的币值最大为i时 来兑换j分钱 的种数不断提高币值i的值,来刷新dp[j]的值例如: dp[5]当i=1时dp[5]=1;当i=2时dp[5]+=dp[5-2]; 即dp[5]=dp[5]+dp[3]=1+2=3; 原来的+dp[3] 当i=3时dp[5]+=dp[5-3]; 即dp[5]=dp[5]+dp[2]=3+2=5; 原来的+dp[2]#include<bits/stdc++.h>#define ll long l原创 2021-03-15 21:18:10 · 74 阅读 · 0 评论 -
LCS HDU1159
戳LCS 最长公共子序列关于LCStqlLCS#include<bits/stdc++.h>#define ll long long#define INF 0x3f3f3f3fusing namespace std;int c[1100][1100]; //前i 前j个元素 的lcschar a[1100],b[1100];int main(){ while(scanf("%s%s",a,b)!=EOF) //string 会WA原创 2021-03-15 21:07:04 · 68 阅读 · 0 评论 -
codeforces 118D
tql这种dp ,一般出现在1700 1800了,让统计方案数,特点就是出现很多维数,每一维都有含义。重要的是,分析好状态,找准状态,转移方程不难得出。切勿凭空想象,会漏掉很多方案。还有就是这类题,最后一般都有一个统计。...转载 2020-07-25 12:19:12 · 150 阅读 · 0 评论 -
codeforces 255C Almost Arithmetical Progression
传送门题意:求长度最长的锯齿形子序列。(非连续)锯齿形:ab型 12121解析:dpdp[ i ][ j ] :表示 以a[i],a[j] 结尾的 符合条件的 子序列长度dp[ i ][ j ] = dp[last][ i ]+1;其中 a[last]==a[j] (头尾相同), last—i-----j例子:12133212 j=8 i 从头推过来 推一遍就明白#include<cstdio>#include<cstring>#include<原创 2020-07-13 18:47:46 · 159 阅读 · 1 评论 -
codeforces 698A. Vacations
传送门儿题目大意:给一个序列限制条件(体育馆开放与否、考试与否),问你这n天最少有几天闲着。方法:dp。分析:每天对应三种状态:闲着、锻炼、考试。定义状态:dp[i][0]闲着 dp[i][1]锻炼 dp[i][2]考试dp表示i天前最多能有几天不闲着(最后用n-不闲着的天数就ok)每个状态的转移有条件限制:0休息:无条件 (易错,休息的条件并不是0,因为哪天都能休息)1锻炼:2 || 32考试:1 || 3补充:codeforces1195C这道题每个i也是三种状态,不一样的原创 2020-07-11 14:35:42 · 180 阅读 · 0 评论 -
codeforces 1195CBasketball Exercise
传送门题意:给两个序列,从左到右选数,不能选同一个序列连续的两个数,问选的数的最大和。分析:dp。每挑选一个数,*存在三种状态*:选上面的1、选下面的2、都不选0。我们只需维护这三种状态,在这三种状态里挑选最大值。注意到可以选择的球员编号是严格递增的,因此可以把状态的第一维定义为球员编号,第二维描述编号同为 i的两名球员的选取情况。定义状态dp[i][0],dp[i][1],dp[i][2]:表示选取了编号i及在前面的球员的身高的最大值状态转移方程:dp[i][0]=max(dp[i-1]原创 2020-07-11 09:41:00 · 217 阅读 · 0 评论 -
codeforces 455 A. Boredom
传送门r题意:给一个数列,选数,选中的数的x+1,x-1要剔除出数列,选中的数求和,求最大和。分析:此题是一道动态规划题,做法是先存下每个数的个数放在c中,消除一个数i,会获得c[i]*i的值(因为可以消除c[i]次),如果从0的位置开始向右消去,那么,消除数i时,i-1可能选择了消除,也可能没有,1.如果消除了i-1,那么i值就已经不存在,dp[i] = dp[i-1],2.如果没有被消除,那么dp[i] = dp[i-2]+ c[i]*i。在上面两者中取最大值即可在两种状态间进行转移,取最原创 2020-07-10 20:27:26 · 135 阅读 · 0 评论 -
codeforces 545 C. Woodcutters
题意:n棵树,可以砍或不砍,可以倒向左或右;问最多可以砍多少棵树;dp:表示第i棵树所占据的最右边的位置。从左向右循环,不断更新dp值。#include<cstdio>#include<cstring>#include<string>#include<algorithm>#include<iostream>#include<map>#include<cmath>#define ll long long .原创 2020-07-10 18:07:24 · 138 阅读 · 0 评论 -
codeforces 1350 B. Orac and Models
传送门题目大意:找最长递增子列满足:1.最长 2.递增 3.后一个index能整除前一个index分析:子列问题,一般两种思路,一个是尺取,一个是dp。用dp。先不管本题的第三个条件,我们考虑一般情况,即:求最长递增子列设dp[i]数组,表示:以s[i]为起始的最长递增子列数目,首先初始化为1。我们可以从数列的后面向前分析(向前递推),先给出转移方程:dp[i]=max(dp[i],dp[j]+1)解释:i为当前位置,j为当前位置的后面的位置,看下面这个例子。如果后面有比自己大的a,那原创 2020-07-10 16:00:01 · 188 阅读 · 0 评论