关闭

LA 4327 Parade (DP单调队列)

标签: ACMdp
279人阅读 评论(0) 收藏 举报
分类:

题目大意:有n+1条横线,m+1条竖线,你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值和最大。同一段路不能走超过两次,且不能从北往南走,另外每条横向路上所花的时间不能超过k


分析:DP+单调队列优化。


#include <queue> 
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define MAXN 0x3f3f3f3f
using namespace std;
int n,m,k;
int vl[105][10005],vr[105][10005],tl[105][10005],tr[105][10005],dp[105][10005],val[105][10005],dis[105][10005];
int main()
{
	while(~scanf("%d%d%d",&n,&m,&k) && n && m)
	{
		memset(vl,0,sizeof(vl));
		memset(vr,0,sizeof(vr));
		memset(tl,0,sizeof(tl));
		memset(tr,0,sizeof(tr));
		n++;
		for(int i = 1;i <= n;i++)
		{
			for(int j = 1;j <= m;j++)
			{
		  		scanf("%d",&val[i][j]);
		  		vl[i][j] = vl[i][j-1] + val[i][j];
		  	}
		  	for(int j = m;j;j--) vr[i][j-1] = vr[i][j] + val[i][j];
		}
		for(int i = 1;i <= n;i++)
		{
			for(int j = 1;j <= m;j++)
			{
		  		scanf("%d",&dis[i][j]);
		  		tl[i][j] = tl[i][j-1] + dis[i][j];
		  	}
		  	for(int j = m;j;j--) tr[i][j-1] = tr[i][j] + dis[i][j];
		}
		int ans = -MAXN;
		for(int i = 1;i <= n;i++)
		{
			deque <int>lq;
			for(int j = 0;j <= m;j++)
			{
				dp[i][j] = -MAXN;
		 		while(!lq.empty() && dp[i-1][j] - vl[i][j] >= dp[i-1][lq.back()] - vl[i][lq.back()]) lq.pop_back();
		 		lq.push_back(j);
		 		while(!lq.empty() && tl[i][j] - tl[i][lq.front()] > k) lq.pop_front();
		 		if(!lq.empty()) dp[i][j] = dp[i-1][lq.front()] - vl[i][lq.front()] + vl[i][j];
		 	}
			deque <int>rq;
			for(int j = m;j >= 0;j--)
			{
				while(!rq.empty() && dp[i-1][j] - vr[i][j] >= dp[i-1][rq.back()] - vr[i][rq.back()]) rq.pop_back();
				rq.push_back(j);
				while(!rq.empty() && tr[i][j] - tr[i][rq.front()] > k) rq.pop_front();
			    if(!rq.empty()) dp[i][j] = max(dp[i][j],dp[i-1][rq.front()] - vr[i][rq.front()] + vr[i][j]); 
				if(i == n) ans = max(ans,dp[i][j]);
			}
		}
		cout<<ans<<endl;
	} 
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

UVaLive 4327 | POJ 3926 - Parade (单调队列优化DP)

Parade Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 658   Accepted...
  • zhaosdfa
  • zhaosdfa
  • 2014-08-13 14:50
  • 620

wikioi-1748 瑰丽华尔兹 -单调队列优化DP

根据题意,很明显可以推出DP方程。 假如只考虑向左的方向: dp[t][i][j]:  第t个时间段末滑行到i,j最长滑行的距离。 dp[t][i][j]=dp[t-1][i][1..k]+(j...
  • rowanhaoa
  • rowanhaoa
  • 2014-05-05 12:42
  • 1127

HDU - 3401 单调队列优化DP

大家都很强, 可与之共勉。Problem DescriptionRecently, lxhgww is addicted to stock, he finds some regular pattern...
  • simpsonk
  • simpsonk
  • 2017-05-06 12:00
  • 2851

hdu 3401 Trade(单调队列优化dp)

hdu 3401 Trade(单调队列优化dp) 题意:lxhgww喜欢炒股票,他可以在第i天买入或者卖出若干张股票(一天只能买或者卖),两个交易日之间至少相隔w天,问他t天后最多能赚多少。 解题...
  • No__stop
  • No__stop
  • 2013-11-08 11:16
  • 1112

【单调队列优化dp】Uvalive4327丨Poj3926 Parade

uvalive戳这里 poj戳这里 单调队列优化的dp……挺显然的………… 70行代码。。写了得快崩溃。。。debug更是要。。。跪。。。了。。。。 没力气写思路了…………反正和trad...
  • qq_21841245
  • qq_21841245
  • 2015-03-30 22:22
  • 481

uva-1427 Parade (单调队列优化dp)

题意 F城由n+1个横向路和m+1个竖向路组成。你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值和最大(注意,一段路上的高兴值可以是负数)。同一段路不能经过两次,且不能从北往南走。另外,...
  • shuangde800
  • shuangde800
  • 2013-08-18 00:14
  • 2114

POJ 3926 Parade 单调队列优化dp

题意:一个国王从矩阵的最下方走到矩阵的最上方(矩阵为n*m,0          和村民的喜好值(可以为负),国王在东西方向上走的最大距离不能超过k,现在想找到一条路径使得经过街区的喜好值和最大。 ...
  • Flying_Stones_Sure
  • Flying_Stones_Sure
  • 2012-09-15 12:00
  • 489

hdu Parade(单调队列优化 dp)

Parade Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm...
  • Wiking__acm
  • Wiking__acm
  • 2012-12-22 22:54
  • 1083

LA3983-Robotruck(dp + 单调队列)

题目链接https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p...
  • Lzedo
  • Lzedo
  • 2016-08-10 23:34
  • 230

[LA3983][DP][单调队列]捡垃圾的机器人

n个垃圾,第i个垃圾坐标为(xi,yi),重量wi,有一个机器人,按照编号从小到大捡垃圾并扔进垃圾箱(垃圾桶在原点(0,0)),可以捡起几个垃圾后一起扔掉,但机器人持有垃圾总重量不得超过lim,两点间...
  • yznoi2017
  • yznoi2017
  • 2016-11-03 21:32
  • 318
    个人资料
    • 访问:102604次
    • 积分:4448
    • 等级:
    • 排名:第7793名
    • 原创:363篇
    • 转载:2篇
    • 译文:0篇
    • 评论:42条
    最新评论