1.luogu 1484种树

50分思路:dp,但是数据规模过大没法dp选择奇怪贪心

dp方程 到i坑种j树 dp[i][j]=max(dp[i-1][j],dp[i-2][j-1])

100分思路:奇怪贪心,全部树坑中最大的i ,每次选择实际上需要选的是max(a[i],a[l]+a[r]);

但是如此转移十分困难,可以进行如下操作:

1.ans+=a[i]

2.设立新节点,利用链表存储各节点间位置关系,新节点的值为a[l]+a[r]-a[i],若日后选入新节点,意味着实际上选择了i两侧的点,未选则最终选择就是i

3.利用优先队列维护上述值,需要取出堆顶值为负则停止进行,并且需要取小于限制的数量

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=;
struct node{
ll v;int id;
bool operator <(node a)const{
return v<a.v;}};
inline ll read(){
ll x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
ll a[N],ans;
int l[N],r[N],vis[N];
priority_queue<node> q;
int n,k;
int main(){
n=read();k=read();
for(int i=;i<=n;i++){
a[i]=read();
q.push((node){a[i],i});
l[i]=i-;r[i]=i+;
}int len=n;
for(int i=;i<=k;i++){
while(!q.empty()&&vis[q.top().id]) q.pop();
if(q.empty()||q.top().v<)
break;
node u=q.top();q.pop();
ans+=u.v;
vis[u.id]=vis[l[u.id]]=vis[r[u.id]]=;
a[++len]=a[l[u.id]]+a[r[u.id]]-a[u.id];
l[len]=l[l[u.id]],r[len]=r[r[u.id]];
r[l[len]]=len;l[r[len]]=len;
q.push((node){a[len],len});
}printf("%lld\n",ans);
return ;
}

2.最大子段和

转移方程:f[i]=max(a[i],f[i-1]+a[i]) 最大子段和

e.g:给为n序列a,f(l,r)=i由l到r,求g[i]*(-1)的(r-i)次方 ,1<=l<=r<=n,求f(l,r)max

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
ll b[],c[],g[],ans;
int main(){int n;scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld",&g[i]);
if(i&) g[i]=-g[i];}
for(int i=;i<=n;i++){
b[i]=max(g[i],b[i-]+g[i]);
c[i]=min(g[i],c[i-]+g[i]);}
for(int i=;i<=n;i++){
if(i&) ans=max(ans,-c[i]);
else ans=max(ans,b[i]);}
printf("%lld\n",ans);return ;
}

3.dp数方案数的模板题

放置某个东西,限制:相隔k个求总方案数 利用前缀和前缀dp

#include<bits/stdc++.h>
#define LL long long
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
const int N=;
const int mod=;
LL n,k,dp[N],s[N];
int main(){
scanf("%lld%lld",&n,&k);
rep(i,,n) dp[i]=;
rep(i,,n){
if(i>k) dp[i]=(dp[i]+s[i--k])%mod;
s[i]=(s[i-]+dp[i])%mod;}
printf("%d",s[n]+);return ;}

dp题的更多相关文章

  1. Codeforces Round #369 (Div. 2)---C - Coloring Trees (很妙的DP题)

    题目链接 http://codeforces.com/contest/711/problem/C Description ZS the Coder and Chris the Baboon has a ...

  2. 4817 江哥的dp题d

    4817 江哥的dp题d  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 已知1-N的排列P的LIS(最长上 ...

  3. 4809 江哥的dp题c

    4809 江哥的dp题c  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 有两个数x,y,一开始x=1,y= ...

  4. 4816 江哥的dp题b

    4816 江哥的dp题b  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给出两个1-N的随机排列A,B.若 ...

  5. 4815 江哥的dp题a

    4815 江哥的dp题a  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 给出一个长度为N的序列A(A1,A ...

  6. HDU 2577 How to Type(dp题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2577 解题报告:有一个长度在100以内的字符串,并且这个字符串只有大写和小写字母组成,现在要把这些字符 ...

  7. codevs4817 江哥的dp题d

    4817 江哥的dp题d  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 黄金 Gold [题目描述] Description 已知1-N的排列P的LIS(最长上升子序列)不超 ...

  8. 古韵之乞巧 题解 dp题

    [noip模拟赛1]古韵之乞巧   描述 闺女求天女,更阑意未阑. 玉庭开粉席,罗袖捧金盘. 向月穿针易,临风整线难. 不知谁得巧,明旦试相看. ——祖咏<七夕> 女子乞巧,是七夕的重头戏 ...

  9. cf1061c 普通dp题

    题解见https://blog.csdn.net/godleaf/article/details/84402128 这一类dp题是可以压缩掉一维空间的,本题枚举a1到an,枚举到ai时枚举ai的每个约 ...

  10. HDU 4472 Count DP题

    解题报告:题目大意,给你n个球,要将这n个球从下到上按层次排列,要求同一个层次的的每一个分支的数量都必须相等,问有多少种排列的方法. 此题的一个DP题,假设现在有n个球,要将这n个球排列好,我们就必须 ...

随机推荐

  1. [转]ubuntu ssh登陆显示系统信息

    Welcome to Ubuntu LTS (GNU/Linux --generic i686) * Documentation: https://help.ubuntu.com/ System in ...

  2. 自定义控件DataPager

    在最近的一个项目中,涉及到一个自定义翻页控制的控件,下面就这一个控件做详细的说明,这个自定义控件的主要作用是对数据源进行翻页控制,比如说:“上一页.下一页.首页.末页”等相关操作,由于在一个项目中有多 ...

  3. 监控系统 & monitoring & DevOps

    监控系统 & monitoring & DevOps https://github.com/topics/monitoring https://github.com/marketpla ...

  4. linux 源的配置更新

    Ubuntu 首先编辑sources.list这个文件 vi /etc/apt/sources.list 把sources.list文件内容替换成如下 deb http://mirrors.aliyu ...

  5. jsp servlet 的 请求转发和重定向

    以前对于servlet和servlet/jsp之间的跳转路径问题感到很迷惑,今天亲自动手实验了一把,总结如下: servlet已经是项目根路径下面的资源了,所以servlet跳转的时候,在跳转路径上面 ...

  6. MySQL中char、varchar和nvarchar的区别

    一.char和varchar的区别char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度.1). 当字符串长度小于255时,用额 ...

  7. BZOJ4530[Bjoi2014]大融合——LCT维护子树信息

    题目描述 小强要在N个孤立的星球上建立起一套通信系统.这套通信系统就是连接N个点的一个树. 这个树的边是一条一条添加上去的.在某个时刻,一条边的负载就是它所在的当前能够 联通的树上路过它的简单路径的数 ...

  8. BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP

    题目描述 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场 ...

  9. copy elison & RVO & NRVO

    蓝色的博文 To summarize, RVO is a compiler optimization technique, while std::move is just an rvalue cast ...

  10. MYSQL数据插入和更新的语法

    tag:原文章地址 经常会遇到一行数据在特定条件下如果存在就更新列,不存在就插入新的行,用replace和duplicate语法都可以实现,但是也是有区别的.如果是数据覆盖就用replace,如果只是 ...