补写一下

poj3171 设f[i]表示覆盖L~i的最小花费,把区间按左端点排序,枚举区间,f[a[i].r]=min{f[a[i].l~(a[top].r-1)]}+a[i].c (当然还要和原值比较的)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;struct node{int l,r,d;}a[31000];
bool cmp(node n1,node n2){return n1.r<n2.r;}struct trnode
{int l,r,lc,rc,c;
}tr[210000];int trlen;
void bt(int l,int r)
{int now=++trlen;tr[now].l=l;tr[now].r=r;tr[now].c=(1<<30);tr[now].lc=tr[now].rc=-1;if(l<r){int mid=(l+r)/2;tr[now].lc=trlen+1;bt(l,mid);tr[now].rc=trlen+1;bt(mid+1,r);}
}
void change(int now,int p,int k)
{if(tr[now].l==tr[now].r){tr[now].c=k;return ;}int lc=tr[now].lc,rc=tr[now].rc;int mid=(tr[now].l+tr[now].r)/2;if(p<=mid)change(lc,p,k);else      change(rc,p,k);tr[now].c=min(tr[lc].c,tr[rc].c);
}
int getmin(int now,int l,int r)
{if(tr[now].l==l&&tr[now].r==r)return tr[now].c;int lc=tr[now].lc,rc=tr[now].rc;int mid=(tr[now].l+tr[now].r)/2;if(r<=mid)  return getmin(lc,l,r);else if(mid+1<=l)return getmin(rc,l,r);else return min(getmin(lc,l,mid),getmin(rc,mid+1,r));
}int f[110000];
int main()
{int n,L,R;scanf("%d%d%d",&n,&L,&R);L++,R++;for(int i=1;i<=n;i++){scanf("%d%d%d",&a[i].l,&a[i].r,&a[i].d);a[i].l++,a[i].r++;if(a[i].r<L||R<a[i].l)i--,n--;if(a[i].l<L)a[i].l=L;if(R<a[i].r)a[i].r=R;}sort(a+1,a+n+1,cmp);int top=1; trlen=0,bt(L,R);memset(f,63,sizeof(f));for(int i=L;i<=R;i++){while(top<=n&&a[top].r==i){if(a[top].l==L){if(a[top].d<f[i])f[i]=a[top].d, change(1,i,f[i]);}else {int k=getmin(1,a[top].l-1,a[top].r-1)+a[top].d;if(k<f[i])f[i]=k, change(1,i,f[i]);}top++;}}if(f[R]==f[0])printf("-1\n");else printf("%d\n",f[R]);return 0;
}

poj3171

hdu5542 f[i][j]表示枚举到第几个位置,长度为j的严格上升序列有多少(注意一定包括第i个位置)

f[i][j]=∑(k<j&&a[k]<a[j])f[k][j-1] 这里先离散化,然后开m个树状数组记录,想想cdq分治,时间维有序第一个限制不管,第二个用树状数组解决。实际操作中,是不用定义数组的,直接插入树状数组中相应位置即可。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const int mod=1e9+7;int lslen;int s[1100][1100];
int lowbit(int x){return x&-x;}
void change(int x,int w,int k)
{while(x<=lslen){s[w][x]=(s[w][x]+k)%mod;x+=lowbit(x);}
}
int getsum(int x,int w)
{int ret=0;while(x>0){ret=(ret+s[w][x])%mod;x-=lowbit(x);}return ret;
}//----------------bit---------------------int a[1100],ls[1100];
int main()
{int T,T_T=0;scanf("%d",&T);while(T--){int n,m;scanf("%d%d",&n,&m);lslen=0;for(int i=1;i<=n;i++)scanf("%d",&a[i]), ls[++lslen]=a[i];sort(ls+1,ls+lslen+1);lslen=unique(ls+1,ls+lslen+1)-ls-1;for(int i=1;i<=n;i++)a[i]=lower_bound(ls+1,ls+lslen+1,a[i])-ls;memset(s,0,sizeof(s));for(int i=1;i<=n;i++){change(a[i],1,1);int li=min(i,m);for(int j=2;j<=li;j++)change(a[i],j,getsum(a[i]-1,j-1));}printf("Case #%d: %d\n",++T_T,getsum(lslen,m));}return 0;
}

hdu5542

转载于:https://www.cnblogs.com/AKCqhzdy/p/9468658.html

0x58 数据结构优化DP相关推荐

  1. BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...

  2. HDU 4990 Ordered Subsequence --数据结构优化DP

    题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...

  3. Atcoder dp_q Flowers 数据结构优化dp

    文章目录 题意 题解 最近在练习atcoder上的dp场,大概只会做一半.我选出一些不会的题目写一下博客. 题意 按顺序每朵花有一个高度,一个美丽度,选出一个高度上升的子序列,求美丽度之和的最大值. ...

  4. AW297 赤壁之战(数据结构优化DP)

    题目地址 状态设计: f[子序列长度][当前位数](严格递增子序列数量). 易错点: 初始化时需要设置f[0][0]=1. 每个独立的数字都只会影响到比它更大的数字. 预处理时的sort保证了整个算法 ...

  5. bzoj1233 单调队列优化dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=1233 数据结构优化dp的代码总是那么抽象 题意:奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Be ...

  6. dp进阶之FFT加速+数据结构优化+不等式优化

    快速傅里叶变换 快速傅里叶变换(英语:Fast Fourier Transform, FFT),是快速计算序列的离散傅里叶变换(DFT)或其逆变换的方法.傅里叶分析将信号从原始域(通常是时间或空间)转 ...

  7. 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)

    正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...

  8. 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)

    正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti​时在wiw_iwi​出现(只出现一个单位时间),价值为sis_isi​,当你t ...

  9. 【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)

    正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点,让你选择若干点,连接x坐标相邻的点,其中连续上升或下降的为一段,问你有多少中选择方案,使得段数为k 解题思路 设fi,j,0/1f_{i ...

最新文章

  1. 阿里P9大佬总结必备的算法和工具,被10万算法工程师点赞
  2. golang 变量定义和初始化
  3. php5.2通过saprfc扩展远程连接sap730成功案例
  4. Linux 进阶笔记(一)
  5. php 单元测试 静态类,可选的PHP类型提示/检查单元测试或静态分析?
  6. 反爬终极方案总结---字体反爬
  7. pyppeteer:比 selenium 更高效的爬虫利器
  8. 苦思冥想时,吃什么,尝一口,酥脆掉渣,鲜掉眉毛!
  9. python中表示空类型的是_python中怎么表示空值
  10. Android中软键盘弹出时关于布局的问题
  11. Python中的命名空间是什么?
  12. paypal添加香港招商银行指南
  13. 程序开发——结对编程
  14. 判断一个整数是否为2的方幂
  15. ubuntu c/c++ 生成.so 并被python调用
  16. 【python统计分析】stats.ttest_ind 独立样本T检验
  17. 2022年6月青少年软件编程(图形化) 等级考试试卷(二级)
  18. 基于android系统的单词学习软件设计与开发【附项目源码+论文说明】分享
  19. python工程师认证证书报考条件_Python工程师需要具备什么条件
  20. 知乎Live初体验,手把手教你如何开一场Live

热门文章

  1. Go语言的错误异常处理机制及其应用
  2. 2022-2028年中国养老保险行业深度调研及投资前景预测报告
  3. Spring中启用Hibernate二级缓存步骤
  4. QT学习之状态机框架
  5. 102. Binary Tree Level Order Traversal
  6. 【SpringMVC】基本概念
  7. python yield 和 return 对比分析
  8. Linux下安装Oracle11g服务器(centos7下)
  9. LeetCode简单题之“气球” 的最大数量
  10. LeetCode简单题之排列硬币