
dp
constbh
这个作者很懒,什么都没留下…
展开
-
hdu 5823(壮压dp)
一开始的思路是状态压缩后,枚举每个状态,然后第二层循环枚举每个状态的单个点,然后通过判断 进行dp[i]=dp[j]+1或者dp[i]=dp[j],j是i的单个点,因为新加入一个点之后不会判断 到底应该不应该加一 所以GG.看了题解,知道了一个概念。独立子集:集合内的点。两两之间都没用边。这样的集合内只需要一种颜色就可以染色。所以由刚刚的思路改成枚举每个状态的独立子集,然后dp[i]=d原创 2017-07-15 15:26:35 · 459 阅读 · 0 评论 -
vijos1412(第k优背包)
求第K优的背包.然后选前K大的价值求和/************************************************************************* > File Name: vijos1059.cpp > Author: > Mail: > Created Time: 2017年10月16日 星期一 10时33分45秒 **********原创 2017-10-16 11:31:44 · 269 阅读 · 0 评论 -
hdu5543(01背包)
带限制条件的01背包dp【i】【k】表示i体积是放在漏出的金条的个数为k时获得的最大价值。#include#include#includeusing namespace std;typedef long long ll;const int maxn = 1000+10;int vo[maxn],va[maxn];ll dp[maxn*4][3];int main(){原创 2017-10-01 10:24:07 · 349 阅读 · 0 评论 -
hdu4283(区间DP)
dp[i][j]表示从第i个人到第j个人这段区间的最小花费(是只考虑这j-i+1个人,不需要考虑前面有多少人)那么对于dp[i][j]的第i个人,就有可能第1个上场,也可以第j-i+1个上场。考虑第K个上场,即在i+1之后的K-1个人是率先上场的,那么就出现了一个子问题 dp[i+1][i+k-1]表示在第i个人之前上场的,对于第i个人,由于是第k个上场的,那么屌丝值便是a[i]*(k-1),其余原创 2017-09-29 19:15:14 · 267 阅读 · 0 评论 -
hdu(HDU5945)单调队列优化DP
#include#include#includeusing namespace std;const int maxn = 1000000+10;int dp[maxn];int q[maxn];int main(){ int cases,x,k,t; scanf("%d",&cases); while(cases--) { memse原创 2017-09-27 16:27:58 · 307 阅读 · 0 评论 -
hdu5542(树状数组优化dp)
很容易想到n^3的dp,,但是要超时,用二维树状数组优化一下枚举上一个点的第三重循环就好了。#include#include#includeusing namespace std;const int maxn = 1005;const int mod = 1000000007;typedef long long ll;int n;int num[maxn];int tmp[m原创 2017-09-07 18:06:09 · 365 阅读 · 0 评论 -
hdu 5900(区间DP)
一开始用线段树维护区间GCD和区间和,然后每次找所有GCD不为1 的区间,区间长度是偶数则结果加上区间和,如果是奇数,枚举1,3,5,7......找出value最小值,然后区间和减去最小值。 后来发现这样不对,因为一写区间被选择之后,原来不相交但是GCD不为1的数字变为了相交,又会使结果变大。然后想每次把选出来的区间删掉,然后重新建树,重复过程,知道找不到区间GCD不为一的情况,就输出累加的和,原创 2017-08-14 20:22:39 · 244 阅读 · 0 评论 -
hdu4336(壮压DP&概率DP)
需要集齐N张卡片,每买一包零食,里面可能有不同的卡片,存在每种卡片的概率已知,每包零食最多有一张卡片。问集齐N张的期望。dp[i]表示i这个状态下还需要多少包的期望,dp[(1一开始不会写,看了别的状态转移方程:dp[i]=sum(dp[i|(1如果想得到一张卡片,期望就是 1/va[k]。 上面的方程和这个应该是一个道理。因为i这个状态可以由很多状态得到 所以变成了sum(dp[i|原创 2017-07-27 10:08:32 · 416 阅读 · 0 评论 -
hdu 4405
普通概率DPdp[i]表示到游戏结束还需要的步数的期望。dp[n] =0;i>n时dp[i] = 0;然后逆推dp[i] = dp[i+j]/6 (j为1-6) 然后每次加一,代表又投掷了一次骰子。有飞行通道的点dp[i] = dp[vis[i]];#include #include #include #include #define ll long longdouble原创 2017-07-25 11:03:51 · 227 阅读 · 0 评论 -
poj2385
开三维dp,第一维是时间,第二维表示在哪颗树下(0表示第一棵,1表示第二棵),第三维表示用了几次移动的机会。然后状态转移方程 if(num[i]==1){ dp[i][0][j] = max(dp[i][0][j],dp[i-1][0][j]+1); if(j!=w) dp[i][0][j] = max(dp[i][0][j],dp[i-1][1][j+1]+1);原创 2017-07-22 19:40:16 · 226 阅读 · 0 评论 -
zoj1346
给了一些点的关系,求拓扑序的个数,点很少可以跑暴力。最近学习状态压缩就写了一发。最多16个点,可以把现在选出来的点的个数进行状态压缩。总共(1枚举每个状态然后找出当前状态下入度为零的不在当前状态中的点。状态转移方程:dp[i|j] += dp[i];dp[0] = 1;#include#include#include#include#includeusing name原创 2017-07-22 14:28:24 · 292 阅读 · 0 评论 -
HDU3905
第一次遇见要用两个dp数组做的题(一个用来保存结果,一个用来辅助)。看了好长时间题解,参考了这里的代码http://blog.youkuaiyun.com/kirito_acmer/article/details/50726662。还是没有完全懂。。。。。以后回来多看看#include #include #include #include #include #include #include原创 2017-07-21 16:21:05 · 267 阅读 · 0 评论 -
hdu3920(壮压DP)
存点后排序,1状态转移: tmp = i|(1当i没有被更新过时要continue 这个题很卡时间。#include#include#include#includeusing namespace std;const int inf = 0x3f3f3f;typedef pairP;int px,py,n;double dp[(1<<20)+10];struct no原创 2017-07-21 16:16:42 · 302 阅读 · 0 评论 -
codeforces892C
昨天晚上写这个题综测挂了,没有特判全是1的情况./************************************************************************* > File Name: cf3.cpp > Author: > Mail: > Created Time: 2017年11月18日 星期六 09时55分17秒 ***********原创 2017-11-18 10:12:04 · 439 阅读 · 0 评论