(每日水题004-1)(DP,滚动数组)洛谷P1508 Likecloud-吃、吃、吃

一、算法分析

乍一看本题有些没有头绪,本题的特点是终点为第一行的任意数,而起点在最后一行,和常见的题相较是反的,而且起点也不在该行的第一个,而是在中间。。。开始的想法是从起点开始找,但是发现很麻烦,但是在仔细一看,画个图出来,这就是不是倒过来的数塔问题吗???所以解法就很直观了,按照和数塔问题一样的思路,从后往前(也就是从第一行开始)倒着推就行了,答案就在起点上。顺便加了一个滚动数组优化,压成一维的。

二、代码及注释

#include<cstdio>
#include<algorithm>
using namespace std; 
const int maxn=255;
int n,m;                                   //还是习惯用n,m 
int f[2][maxn];
int pos_ed;
int main(){

    scanf("%d%d",&n,&m); 
	for(int i=1;i<=n;i++){                    //相当于数塔问题的一个改版,采用倒推法 
  	int pos=i&1;
  	int pre=(i&1)^1;
  	for(int j=1;j<=m;j++){
  		scanf("%d",&f[pos][j]);               //读入当前数据 
		  f[pos][j]+=max(f[pre][j-1],max(f[pre][j],f[pre][j+1]));//从三个方向继承 
		}
	}
	printf("%d",max(f[n&1][m/2+1-1],max(f[n&1][m/2+1],f[n&1][m/2+1+1])));//注意这里,牛的起点可能有三个,因为牛最开始处于最后一行中间点的下方,而不是点上 
  return 0; 
  
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值