hdoj 2829 斜率优化DP
来源:互联网 发布:田岛美工刀片价格 编辑:程序博客网 时间:2024/06/14 22:05
又是一道斜率优化DP。
设dp[i][j]表示前i点,炸掉j条边的最小值。j<i
dp[i][j]=min{dp[k][j-1]+cost[k+1][i]}
又由得出cost[1][i]=cost[1][k]+cost[k+1][i]+sum[k]*(sum[i]-sum[k])
cost[k+1][i]=cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k])
代入DP方程
可以得出 dp[i][j]=dp[k][j-1]-cost[1][i]-cost[1][k]-sum[k]*(sum[i]-sum[k]);
根据转移方程可以推出斜率公式
设k1<k2
(dp[k2][j-1]-cost[1][k2]+sum[k2]^2-(dp[k1][j-1]-cost[1][k1]+sum[k1]^2))/(sum[k2]-sum[k1])<sum[i]
下面就是根据公式编码了
代码如下:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define MAX 1111__int64 dp[MAX][MAX],cost[MAX],sum[MAX];int a[MAX],q[MAX];int head,tail;int n,m;void deal(){ int i,j; for(i=1;i<=n;i++) { sum[i]=sum[i-1]+a[i]; } for(i=1;i<=n;i++) { cost[i]=cost[i-1]+sum[i-1]*a[i]; }}__int64 calcost(int k,int i) //cost[k+1,i];{ return cost[i]-cost[k]-sum[k]*(sum[i]-sum[k]);}__int64 getup(int k1,int k2,int j){ return dp[k2][j-1]-cost[k2]+sum[k2]*sum[k2]-(dp[k1][j-1]-cost[k1]+sum[k1]*sum[k1]);}int main(){ int i,j; while(scanf("%d%d",&n,&m),n) { for(i=1;i<=n;i++) scanf("%d",&a[i]); deal(); for(i=1;i<=n;i++) dp[i][0]=cost[i]; for(j=1;j<=m;j++) { head=tail=0; q[tail++]=j; for(i=j+1;i<=n;i++) { while(head+1<tail&&getup(q[head],q[head+1],j)<=sum[i]*(sum[q[head+1]]-sum[q[head]])) head++; dp[i][j]=dp[q[head]][j-1]+calcost(q[head],i); while(head+1<tail&&getup(q[tail-1],i,j)*(sum[q[tail-1]]-sum[q[tail-2]])<=(sum[i]-sum[q[tail-1]])*getup(q[tail-2],q[tail-1],j)) tail--; q[tail++]=i; } } printf("%I64d\n",dp[n][m]); } return 0;}
0 0
- hdoj 2829 斜率优化DP
- HDOJ 2829 Lawrence(斜率优化DP)
- hdoj 3480 斜率优化DP
- HDOJ 3480 Division(斜率优化DP)
- HDOJ-3507 Print Article (斜率优化dp)
- hdu 2829 斜率优化DP
- hdu 2829 斜率优化DP
- hdoj MAX Average Problem 2993 (斜率优化DP)
- HDOJ 3507 Print Article (斜率优化DP)
- HDOJ 3045 Picnic Cows(斜率优化DP)
- HDOJ-3480斜率优化
- hdoj 2993 斜率优化
- HDU 2829 Lawrence【斜率优化dp】
- hdu 2829 Lawrence(二维DP+斜率优化)
- HDU 斜率优化dp 2829 Lawrence
- HDU 2829 Lawrence 斜率优化DP
- HDU 2829 Lawrence (斜率优化DP)
- HDU-2829-Lawrence-dp-斜率优化
- Writing GNU Emacs Extensions ch1 要点
- TS数据结构分析
- ubuntu server 14.04 搭建svn服务器
- POJ 3680 Intervals(费用流+离散化)
- 【算法导论学习-20】单链表(single linked)的实现
- hdoj 2829 斜率优化DP
- tailq
- 动态内存分配
- 使用Eclipse对FFMpeg进行调试
- POJ1068
- yum 和 rpm的不同
- [Windows问题-3] C#转换成DLL文件
- 理解 Linux 的硬链接与软链接(二)
- 非递归的快速排序算法