
DP
文章平均质量分 55
ehi11
这个作者很懒,什么都没留下…
展开
-
hoj Quantum Blasting DP
/*注意子问题的构造和提取。这道题从最开始的情况考虑。一直到两端。f[i][j]=max(f[i+1][j]+a[i]*(t-j+i),f[i][j-1]+a[j]*(t-j+i));注意(t-j+i)表示次数。循环注意顺序。目标是使子问题的解得以重复利用。dp要认真考虑他的子问题和状态转移。注意预处理和循环。*/#include #include原创 2012-06-14 22:33:55 · 358 阅读 · 0 评论 -
hdu Max Sum of Max-K-sub-sequence 单调队列优化DP
/*求一个环的连续最大子段和。并且输出该最大字段和的和,启示位置和终止位置。s[i]-s[j]课表示任意最大字段和。当枚举i的时候,只需要求出此时最小的s[j]即可。此时可以维护一个单调上升的队列。每次取队首元素即可为s[j]的最小值。*/#include #include #define maxn 200001struct node{ int num,id; nod原创 2012-08-09 09:39:55 · 1553 阅读 · 0 评论 -
I love sneakers! 分组背包DP
/*一道分组背包的题。比赛的时候循环顺序整反了。悲剧了。f[i][j]=max(max(f[i][j],f[i-1][j-c[i][p]]+w[i][p]),f[i][j-c[i][p]]+w[i][p]);表示取到前i个牌子时取到的最大的价值。而每个牌子必须至少取一次。每个物品最多取一次。f[i][j],f[i][j-c[i][p]]+w[i][p]保证在同一牌子内取或不取。f[i-原创 2012-08-12 09:56:11 · 997 阅读 · 0 评论 -
maxsum dp
/*控制i,枚举所有的子矩阵。将每一个字矩阵的列全都累加到最上端,然后将子矩阵的最上端当做一维的最大子段和。只需求出所有子矩阵的最大和即可。*/#include #include #include using namespace std;int a[101][101];int maxsum(int n,int *a){ int sum=-129,b=0;原创 2012-07-27 23:39:10 · 404 阅读 · 0 评论 -
The Brick Stops Here dp 01背包
/*原本是三维,f[1][2][3];1是记录选到第几个数。2是记录已经用过哪些石头3是记录当前状态的总价值。现将三维压缩成二维。注意初始化的问题,由于是取min,则除了0 0 之外取无穷大。时刻注意状态转移方程的含义。*/#include #include int dp[201][20001];int v[201];//含量int w[201];//价格const in原创 2012-07-27 23:29:41 · 679 阅读 · 0 评论 -
hoj 1760 The jackpot一维
#include #include int f[10001];int main(){ int n,a,ans; while(scanf("%d",&n)==1&&n) { memset(f,0,sizeof(f)); ans=-1; for(int i=0;i<n;i++) {原创 2013-04-07 11:04:50 · 1078 阅读 · 0 评论 -
hoj 2558 二维最大子段和
#include #include int a[101][101],sum[101][101];int f[101];int main(){ int n,t,ans,max; while(scanf("%d",&n)==1) { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++)原创 2013-04-07 11:06:03 · 1314 阅读 · 0 评论 -
hoj 2555 三维最大子段和
枚举底面的小矩形。#include #include int sum[33][51][51],f[51],a[33][51][51];int main(){ int h,n,m,t,max,ans; while(scanf("%d%d%d",&h,&n,&m)==3) { memset(sum,0,sizeof(sum)); for原创 2013-04-07 11:06:50 · 1007 阅读 · 0 评论 -
动态规划小结(1)最大子段和
1.对于一维问题,求解一个序列中的连续子段的最大和。状态:一维数组dp[i]:以i结尾的最大子段和,并非前i项的最大子段和,二者有区别。转移:if dp[i]>0 dp[i+1]=dp[i]+a[i] else dp[i+1]=dp[i] ans=max(dp[k];k=1,2,....n),空间上可以用滚动数组的原理优化,空间复杂原创 2013-04-07 11:00:26 · 1324 阅读 · 0 评论 -
hdu Bomb 按位DP
/*就是求一个数中出现49的概率。dp[1][2][3][4]。1表示当前枚举到的位数。2表示当前位上的数字。3表示对应的状态。4是判断枚举的时候有没有超过数的上限。。就是判断上限的时候要注意一下即可。*/#include #include typedef long long LL;LL dp[100][10][3][2];char a[100];int main(){原创 2012-08-08 22:18:22 · 568 阅读 · 0 评论 -
Buy Tickets hoj 单调队列优化DP的简单应用
/*题意是问能相互看见的人有多少对。只需要建一个单调递减的队列。枚举每一个i时,对前i-1个元素形成的单调队列里找>=a[i]的元素的个数即可。简单、*/#include #include #define maxn 500001using namespace std;int q[maxn];int a[maxn];int main(){ int n; while(原创 2012-08-08 22:13:50 · 577 阅读 · 0 评论 -
hoj 整数划分问题 经典dp
#include #include #include using namespace std;int dp[100];int n,k;//分成不同任意正整数之和void fa(int n,int k){ memset(dp,0,sizeof(dp)); dp[0]=1; for(int i=1;i<=k;i++)原创 2012-06-14 22:26:41 · 664 阅读 · 0 评论 -
hoj Score Sequence DP
/*模型为最长公共子序列。对数据预处理的时候先排序,将重复的元素设为0.不影响后面的求和。*/#include #include #include #include #define max(a,b) (a>b?a:b)const int mm=30;int a[mm+1];int b[mm+1];int maxlen[mm+1][mm+1];i原创 2012-06-14 22:29:31 · 377 阅读 · 0 评论 -
hdu football 概率DP
/*首先.dp的思路是dp[i][j].表示必到第i场的时候j还留在在场,即第i场比赛的时候j胜了.他的转移条件是i-1场j也胜了,而且i-1场还有另一支队伍k也胜了,且这两支队伍在第i场的时候相遇了,而此时j胜了k.所以.转移的方程可以写成dp[i][j]=dp[i-1][j]*dp[i-1][k]*p[i][k].而如何确定k成了现在的问题.经过计算,从高往低记为1,2,3,....n+1.原创 2012-08-07 21:58:44 · 527 阅读 · 0 评论 -
hdu 3835 概率DP
#include #include #define maxn 1010double p[maxn][maxn][4];double dp[maxn][maxn];using namespace std;int main(){ int r,c; while(scanf("%d%d",&r,&c)==2) { for(int i=1; i<=r;原创 2012-08-07 22:03:22 · 693 阅读 · 0 评论 -
HDU——Anniversary party 树DP入门
/*问题大意是父亲和儿子不能同时邀请.先用一个二维数组记录父亲和儿子的关系.二维数组的第一个元素记录该父亲的节点的儿子数.然后状态转移就是考虑该点取或不取.dp[i][0]=sum(maxdp[sons][i],dp[sons][0]).dp[i][1]=sum(dp[suns][0]+cost[i]).可在初始的时候将cost[i]直接付给dp[i][1].*/#include #inclu原创 2012-08-07 22:06:55 · 770 阅读 · 0 评论 -
poj 2096 马克科夫链
/*重点是理解dp数组的含义。Poj 的collect bugs.题意就是给n种bug和s个子系统.发现一个bug需要一天的时间.求期望的天数.主要是dp[i][j]的构造.它表示当前已经在j个子系统内发现n个bug,里最后结果还相差的期望天数.一次推出四个转移方程.如dp[i+1][j]表示新发现了一种bug.则对应的概率为(n-i)*j/(n*s*1.0).表示在还剩n-i的bug里除以总原创 2012-08-07 22:09:07 · 1036 阅读 · 0 评论 -
ssworld VS DDD hdu 概率DP
#include //注意题意,是从第一个人先胜的常熟的=第二个人的hp时,才赢.所以n和m应该反过来枚举#include #define maxn 2001double dp[maxn][maxn];double a[6];double b[6];int main(){ int n,m; while(scanf("%d%d",&n,&m)==2) {原创 2012-08-07 22:10:27 · 865 阅读 · 0 评论 -
Sequences hoj 单调队列优化DP
/*可以用单调队列优化的DP一般是用于限定长度的区间,且区间有整体移动的趋势。即每一个元素是逐次进出区间,且只有一次。这样的题目一般都是有比较明显的模板。下面的这个就是集训的时候学长给的模板。感觉挺好写和理解。不过综合对比时间效率。感觉不一定是最高效的。题意是给你固定的区间长度范围。求该序列首端和末端的和最大值。简单。维护一个单调队列进行优化即可。有些细节看代码的注释。*/#include原创 2012-08-08 22:12:32 · 744 阅读 · 0 评论 -
LRJ白书图论 11324 - The Largest Clique uva
/* 题意:给一张有向图,求这样的一个点集,使得集合中的点u,v,u->v,or v->u,or,uv。 对图缩点,构造一张DAG。在DAG上作dp最长路。 点权为每个强连通分量重节点的个数。*/#include #include #include #include using namespace std;const int maxn=1010;const int原创 2013-05-04 08:37:43 · 1332 阅读 · 0 评论