POJ3709 K-Anonymous Sequence(k匿名序列)(斜率优化dp)
来源:互联网 发布:学linux能干哪些工作 编辑:程序博客网 时间:2024/04/25 19:15
poj3709题目传送 看到这名字第一反应是那个面具
斜率优化的动态规划,第一次做斜率优化的dp题。。。而且自己也不会,是看着书慢慢弄懂的。书是《挑战》p341 ,这一面有很多错误,刚开始自己写完后照书上一对,一模一样后发现答案很不对,后来才发现书上的状态转移方程存在错误(在下面的公式里你自己对一遍就知道了) 总之就是,书上的不一定对,自己领悟并理解才最重要。
首先不难得出,
直接计算自然没问题,但是
例如我们记一个前缀和,
有
观察方程我们可以发现,若我们设一个函数(用x替换i)
于是我们考虑用双端队列去维护所有可能成为最小值的直线的集合,并以从小到大的顺序排列。那么我们如何判断要去掉某条直线呢?
设:
我们有
时,
简证:当
得
然后对于
而
当
拿纸来算吧 化简就有
所以我们就可以根据上述方法来做双端队列,详见标程:
#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <vector>#include <queue>using namespace std;typedef long long ll;const ll maxn=505000;ll cas=0;ll n,k;ll a[maxn];ll deq[maxn];//虽然是双端队列 但存的是值ll dp[maxn*10];ll sh[maxn];//前缀和bool check(ll f1,ll f2,ll f3){ ll a1=-a[f1]; ll b1=dp[f1]-sh[f1+1]+a[f1]*(f1+1); ll a2=-a[f2]; ll b2=dp[f2]-sh[f2+1]+a[f2]*(f2+1); ll a3=-a[f3]; ll b3=dp[f3]-sh[f3+1]+a[f3]*(f3+1); return (a2-a1)*(b3-b2)>=(b2-b1)*(a3-a2);}ll f(ll j,ll x){ return -a[j]*x+dp[j]-sh[j+1]+a[j]*(j+1);}int main(){ //freopen("1.in","r",stdin); //freopen("2.out","w",stdout); scanf("%lld",&cas); for(ll z=0;z<cas;z++) { memset(sh,0,sizeof(sh)); memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); memset(deq,0,sizeof(deq)); scanf("%lld%lld",&n,&k); for(ll i=0;i<n;i++) { scanf("%lld",&a[i]); } for(ll i=0;i<n;i++) { sh[i+1]=sh[i]+a[i]; } ll s=0; ll t=1; deq[s]=0; dp[0]=0; for(ll i=k;i<=n;i++) { if(i-k>=k) { while(s+1<t && check(deq[t-2],deq[t-1],i-k)) { t--; } deq[t]=i-k; t++; } while(s+1<t && f(deq[s],i)>=f(deq[s+1],i)) { s++; } dp[i]=sh[i]+f(deq[s],i); } printf("%lld\n",dp[n]); } return 0;}
书上没看懂得就来看一下这个吧QAQ
- POJ3709 K-Anonymous Sequence(k匿名序列)(斜率优化dp)
- 【POJ3709】K-Anonymous Sequence K佚名序列丶 斜率优化DP
- POJ 3709 K-Anonymous Sequence(斜率优化DP)
- dp专辑 C - K-Anonymous Sequence [ 斜率优化]
- poj 3709 K-Anonymous Sequence(斜率优化DP)
- poj 3709 K-Anonymous Sequence 斜率优化dp
- poj 3709 K-Anonymous Sequence 斜率优化dp
- POJ 3709 K-Anonymous Sequence (斜率优化DP)
- poj 3709 K-Anonymous Sequence dp斜率优化
- POJ 3709 K-Anonymous Sequence (斜率优化DP)
- POJ 3709 K-Anonymous Sequence (斜率优化DP)
- POJ 3709 K-Anonymous Sequence(斜率DP)
- POJ 3709 K-Anonymous Sequence 斜率优化
- POJ - 3709 K-Anonymous Sequence(斜率优化)
- poj 3709 K-Anonymous Sequence(DP-单调性优化-斜率优化)
- poj 3709 K-Anonymous Sequence 斜率优化dp 分组有大小限制
- poj 3709 K-Anonymous Sequence 动态规划+斜率优化
- poj 3709 K-Anonymous Sequence
- Unity中的爆炸力
- 【第11题】360校园招聘2015届技术类笔试题
- android蓝牙4.0的知识要点
- 【第12题】360校园招聘2015届技术类笔试题
- Lambda&Java多核编程-5-函数式接口与function包
- POJ3709 K-Anonymous Sequence(k匿名序列)(斜率优化dp)
- PAT-练习集-L1-025. 正整数A+B
- leetcode [Sqrt(x)]
- codeforces 782B
- C语言 strnlen函数实现
- 【第13题】360校园招聘2015届技术类笔试题
- Android注解使用之ButterKnife 8.0注解使用介绍
- 【贪心算法】最少拦截系统
- 重温数据结构一