0x58 数据结构优化DP
补写一下
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相关推荐
- BZOJ 1592. Making the Grade(思维,数据结构优化DP,以及三个拓展问题)[Usaco2008 Feb]【BZOJ计划】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ简单题合集x 目录 BZOJ 1592. Making the Grade 拓展问题一 拓展问 ...
- HDU 4990 Ordered Subsequence --数据结构优化DP
题意:给一串数字,问长度为m的严格上升子序列有多少个 解法:首先可以离散化为10000以内,再进行dp,令dp[i][j]为以第i个元素结尾的长度为j的上升子序列的个数, 则有dp[i][j] = S ...
- Atcoder dp_q Flowers 数据结构优化dp
文章目录 题意 题解 最近在练习atcoder上的dp场,大概只会做一半.我选出一些不会的题目写一下博客. 题意 按顺序每朵花有一个高度,一个美丽度,选出一个高度上升的子序列,求美丽度之和的最大值. ...
- AW297 赤壁之战(数据结构优化DP)
题目地址 状态设计: f[子序列长度][当前位数](严格递增子序列数量). 易错点: 初始化时需要设置f[0][0]=1. 每个独立的数字都只会影响到比它更大的数字. 预处理时的sort保证了整个算法 ...
- bzoj1233 单调队列优化dp
https://www.lydsy.com/JudgeOnline/problem.php?id=1233 数据结构优化dp的代码总是那么抽象 题意:奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Be ...
- dp进阶之FFT加速+数据结构优化+不等式优化
快速傅里叶变换 快速傅里叶变换(英语:Fast Fourier Transform, FFT),是快速计算序列的离散傅里叶变换(DFT)或其逆变换的方法.傅里叶分析将信号从原始域(通常是时间或空间)转 ...
- 【DP】【树状数组】方伯伯的玉米田/优美玉米(luogu 3287/金牌导航 数据结构优化DP-5)
正题 luogu 3287 金牌导航 数据结构优化DP-5 题目大意 有n个玉米,给出高度,你可以选择一个区间,使这个区间的玉米高度+1,你可以进行k次这样的操作,查询你操作完后最长不下降子序列最大值 ...
- 【DP】【树状数组】免费馅饼(luogu 7302/金牌导航 数据结构优化DP-4)
正题 luogu 7302 金牌导航 数据结构优化DP-4 题目大意 在坐标轴上会出现n个金币,第i个金币tit_iti时在wiw_iwi出现(只出现一个单位时间),价值为sis_isi,当你t ...
- 【DP】【树状数组】折线统计(金牌导航 数据结构优化DP-1)
正题 金牌导航 数据结构优化DP-1 题目大意 平面上有n个点,让你选择若干点,连接x坐标相邻的点,其中连续上升或下降的为一段,问你有多少中选择方案,使得段数为k 解题思路 设fi,j,0/1f_{i ...
最新文章
- 阿里P9大佬总结必备的算法和工具,被10万算法工程师点赞
- golang 变量定义和初始化
- php5.2通过saprfc扩展远程连接sap730成功案例
- Linux 进阶笔记(一)
- php 单元测试 静态类,可选的PHP类型提示/检查单元测试或静态分析?
- 反爬终极方案总结---字体反爬
- pyppeteer:比 selenium 更高效的爬虫利器
- 苦思冥想时,吃什么,尝一口,酥脆掉渣,鲜掉眉毛!
- python中表示空类型的是_python中怎么表示空值
- Android中软键盘弹出时关于布局的问题
- Python中的命名空间是什么?
- paypal添加香港招商银行指南
- 程序开发——结对编程
- 判断一个整数是否为2的方幂
- ubuntu c/c++ 生成.so 并被python调用
- 【python统计分析】stats.ttest_ind 独立样本T检验
- 2022年6月青少年软件编程(图形化) 等级考试试卷(二级)
- 基于android系统的单词学习软件设计与开发【附项目源码+论文说明】分享
- python工程师认证证书报考条件_Python工程师需要具备什么条件
- 知乎Live初体验,手把手教你如何开一场Live