在刷ZeroClock大神的区间DP专辑,遇见了ZOJ3469,完全不无从下手,然后有人说是论问题,推荐看徐源盛《对一类动态规划问题的研究》这篇论文,果断得膜拜了下,感觉好神奇,可以把未来的费用提前计算好~~~顺便把相关的三道题A了,其实都是一样的。。。

BZOJ2037 [Sdoi2008]Sue的小球

题目大意

中文的。。。

题解

这是论文的例题

直接上原文的讲解吧。。。

把dp数组初始化为0x7fffffffWA了,改成0x3f3f3f3f就AC了。。。

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <utility>
using namespace std;
#define MAXN 1005
#define INF 0x3f3f3f3f
int dp[2][MAXN][MAXN];
int sum[MAXN];
bool visit[MAXN][MAXN];
int n,x0;
typedef struct
{
int x,y,v;
} NODE;
NODE a[MAXN];
bool cmp(const NODE a,const NODE b)
{
return a.x<b.x;
}
void dfs(int l,int r)
{
if(visit[l][r]) return;
if(l==r)
{
if(a[r].x==x0)
dp[0][l][r]=dp[1][l][r]=0;
else dp[0][l][r]=dp[1][l][r]=-INF;
return;
}
visit[l][r]=1;
dfs(l+1,r);
dfs(l,r-1);
dp[0][l][r]=a[l].y+max(dp[0][l+1][r]-(a[l+1].x-a[l].x)*(sum[n]-sum[r]+sum[l]),
dp[1][l+1][r]-(a[r].x-a[l].x)*(sum[n]-sum[r]+sum[l]));
dp[1][l][r]=a[r].y+max(dp[1][l][r-1]-(a[r].x-a[r-1].x)*(sum[n]-sum[r-1]+sum[l-1]),
dp[0][l][r-1]-(a[r].x-a[l].x)*(sum[n]-sum[r-1]+sum[l-1]));
return;
}
int main()
{
scanf("%d%d",&n,&x0);
for(int i=1; i<=n; i++)
scanf("%d",&a[i].x);
for(int i=1; i<=n; i++)
scanf("%d",&a[i].y);
for(int i=1; i<=n; i++)
scanf("%d",&a[i].v);
a[++n].x=x0;
sort(a+1,a+n+1,cmp);
sum[0]=0;
for(int i=1; i<=n; i++)
sum[i]=sum[i-1]+a[i].v;
dfs(1,n);
printf("%.3lf\n",(double)(max(dp[0][1][n],dp[1][1][n]))/1000.0);
return 0;
}

POJ3042 Grazing on the Run

题目大意

在X坐标轴上有n堆草,有一条牛的初始位置是在坐标L,牛(移动速度为1个单位/s)每次可以向左或者向右把一堆草吃掉,每堆草有一个腐烂度,它的值等于牛从开始到吃它位置的时间,牛想把所有草吃完之后,腐烂值的总和最小

题解

先对坐标进行排序,然后就进行DP,方程和BZOJ2037是一样的~~~

代码:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define INF 0x3f3f3f3f
#define MAXN 1005
int dp[2][MAXN][MAXN];
int x[MAXN];
int n,x0;
int main()
{
scanf("%d%d",&n,&x0);
for(int i=1;i<=n;i++)
scanf("%d",&x[i]);
x[++n]=x0;
sort(x+1,x+n+1);
for(int i=1;i<=n;i++)
if(x[i]!=x0)dp[0][i][i]=dp[1][i][i]=INF;
else
dp[0][i][i]=dp[1][i][i]=0;
for(int i=n;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
dp[0][i][j]=min(dp[0][i+1][j]+(x[i+1]-x[i])*(n-j+i),
dp[1][i+1][j]+(x[j]-x[i])*(n-j+i));
dp[1][i][j]=min(dp[1][i][j-1]+(x[j]-x[j-1])*(n-j+i),
dp[0][i][j-1]+(x[j]-x[i])*(n-j+i));
}
printf("%d\n",min(dp[0][1][n],dp[1][1][n]));
return 0;
}

ZOJ3469  Food Delivery

题目大意

和上题没啥区别。。。

有n个人叫餐,每个人都在x轴上,并且每个人都有个坑爹度(和等餐时间有关,据说顾客认为坑爹值到一定程度他的小宇宙就要爆发).现在送餐员从x轴上的某点出发,路上奔跑速度是v,要一次性把所有餐送完。叫餐的人得到餐的时间和顺序不同,坑爹度总和也就不同

题解

同上。。。

代码:

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAXN 1005
#define x first
#define y second
#define INF 0x3f3f3f3f
int dp[2][MAXN][MAXN];
int sum[MAXN];
bool visit[MAXN][MAXN];
pair<int,int>a[MAXN];
int n,v,x0;
void dfs(int l,int r)
{
if(visit[l][r]) return;
if(l==r)
{
if(a[l].x==x0)dp[0][l][r]=dp[1][l][r]=0;
else
dp[0][l][r]=dp[1][l][r]=INF;
return;
}
visit[l][r]=true;
dfs(l+1,r);
dfs(l,r-1);
dp[0][l][r]=min(dp[0][l+1][r]+(a[l+1].x-a[l].x)*(sum[n]-sum[r]+sum[l]),
dp[1][l+1][r]+(a[r].x-a[l].x)*(sum[n]-sum[r]+sum[l]));
dp[1][l][r]=min(dp[1][l][r-1]+(a[r].x-a[r-1].x)*(sum[n]-sum[r-1]+sum[l-1]),
dp[0][l][r-1]+(a[r].x-a[l].x)*(sum[n]-sum[r-1]+sum[l-1]));
}
int main()
{
while(scanf("%d%d%d",&n,&v,&x0)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
a[++n].x=x0;
a[n].y=0;
sort(a+1,a+n+1);
sum[0]=0;
for(int i=1;i<=n;i++)
sum[i]=sum[i-1]+a[i].y;
memset(visit,false,sizeof(visit));
dfs(1,n);
printf("%d\n",v*min(dp[0][1][n],dp[1][1][n]));
}
return 0;
}

费用提前计算相关的DP(BZOJ2037,POJ3042,ZOJ3469)的更多相关文章

  1. POJ 3042 区间DP(费用提前计算相关的DP)

    题意: 思路: f[i][j][1]表示从i到j的区间全都吃完了 现在在j点 变质期最小是多少 f[i][j][0]表示从i到j的区间全都吃完了 现在在i点 变质期最小是多少 f[i][j][0]=m ...

  2. 【BZOJ2037】[Sdoi2008]Sue的小球 区间DP+费用提前

    [BZOJ2037][Sdoi2008]Sue的小球 Description Sue和Sandy最近迷上了一个电脑游戏,这个游戏的故事发在美丽神秘并且充满刺激的大海上,Sue有一支轻便小巧的小船.然而 ...

  3. BZOJ-2037 Sue的小球 DP+费用提前

    似乎很早时学长考过很类似的? 2037: [Sdoi2008]Sue的小球 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 558 Solved: 300 ...

  4. BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]

    2726: [SDOI2012]任务安排 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 868  Solved: 236[Submit][Status ...

  5. [bzoj2726][SDOI2012]任务安排 ——斜率优化,动态规划,二分,代价提前计算

    题解 本题的状态很容易设计: f[i] 为到第i个物件的最小代价. 但是方程不容易设计,因为有"后效性" 有两种方法解决: 1)倒过来设计动态规划,典型的,可以设计这样的方程: d ...

  6. 通过IP地址和子网掩码与运算计算相关地址

    通过IP地址和子网掩码与运算计算相关地址 知道IP地址和子网掩码后可以算出 网络地址 广播地址 地址范围 本网有几台主机 例一:下面例子IP地址为192.168.100.5 子网掩码是255.255. ...

  7. zoj 3469 Food Delivery 区间dp + 提前计算费用

    Time Limit: 2 Seconds      Memory Limit: 65536 KB When we are focusing on solving problems, we usual ...

  8. UVA - 1625 Color Length[序列DP 提前计算代价]

    UVA - 1625 Color Length   白书 很明显f[i][j]表示第一个取到i第二个取到j的代价 问题在于代价的计算,并不知道每种颜色的开始和结束   和模拟赛那道环形DP很想,计算这 ...

  9. 洛谷P1220关路灯[区间DP 提前计算代价]

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

随机推荐

  1. hdu 5172 GTY's gay friends

    GTY's gay friends 题意:给n个数和m次查询:(1<n,m<1000,000);之后输入n个数值(1 <= ai <= n):问下面m次查询[L,R]中是否存在 ...

  2. Unity3d Shader开发(三)Pass(Alpha testing )

    透明度测试是阻止像素被写到屏幕的最后机会. 在最终渲染出的颜色被计算出来之后,可选择通过将颜色的透明度值和一个固定值比较.如果比较的结果失败,像素将不会被写到显示输出中. Syntax 语法 Alph ...

  3. WiFi与WLAN的区别

    很多人到了某一个地方首选要找的就是无线网络,有时候还会问周围的人:这里有WiFi吗?或者说:这里有WLAN吗?那WiFi和WLAN有什么区别呢? 简单来讲,WiFi是无线保真(wireless fid ...

  4. sqlserver 2008express版本启用混合登陆和sa

    本机环境:win10 64位  vs2010及其自带的数据库 sqlserver2008 express版本 用命令行登陆数据库: osql -E -Slocalhost\sqlexpress 登陆成 ...

  5. RWD

    http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries http://www.webdesigns ...

  6. MyEclipse中文乱码,编码格式设置,文件编码格式 总结

    一.设置新建常见文件的默认编码格式,也就是文件保存的格式.在不对MyEclipse进行设置的时候,默认保存文件的编码,一般跟简体中文操作系统(如windows2000,windowsXP)的编码一致, ...

  7. vi/vim 基本使用

    摘要: 在minicom终端里修改开发板中的文件时,必须要用到vi,因为开发板中并不像开发主机那样,有gedit和kscope这样的编辑器:还有,即便是在开发主机上,也会经常用到vi,因为vi使用起来 ...

  8. 如何关闭win7的ps/2兼容鼠标(触屏版)

    买了一个新电脑联想ThinkPad E555 可是刚拿到是个win10 的系统,用习惯了win7,win0不太好用, 然后帮我刷成了win7,之后一切都好,性能也是让我很满意,但是却关不掉触控板,于是 ...

  9. 【PythonChallenge】Level 5

    题目主要找发声类似于Peak Hell的Python模块,查了一下手册pickle已经是最像的了.看了一下源代码,发现panner.p.如同发现了新大陆,拷贝内容.使用pickle解答.答案为chan ...

  10. hdu4678Mine

    http://acm.hdu.edu.cn/showproblem.php?pid=4678 之前写了一并差集找连通块 貌似不对 比赛时写的dfs爆栈了 只好用bfs了 单独数字块  为1 空白+数字 ...