洛谷 P1508 Likecloud-吃吃吃 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1508 Likecloud-吃吃吃 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:https://www.luogu.org/problem/show?pid=1508
题目背景
问世间,青春期为何物?
答曰:“甲亢,甲亢,再甲亢;挨饿,挨饿,再挨饿!”
题目描述
正处在某一特定时期之中的李大水牛由于消化系统比较发达,最近一直处在饥饿的状态中。某日上课,正当他饿得头昏眼花之时,眼前突然闪现出了一个n*m(n and m<=200)的矩型的巨型大餐桌,而自己正处在这个大餐桌的一侧的中点下边。餐桌被划分为了n*m个小方格,每一个方格中都有一个圆形的巨型大餐盘,上面盛满了令李大水牛朝思暮想的食物。李大水牛已将餐桌上所有的食物按其所能提供的能量打了分(有些是负的,因为吃了要拉肚子),他决定从自己所处的位置吃到餐桌的另一侧,但他吃东西有一个习惯——只吃自己前方或左前方或右前方的盘中的食物。
由于李大水牛已饿得不想动脑了,而他又想获得最大的能量,因此,他将这个问题交给了你。
每组数据的出发点都是最后一行的中间位置的下方!
输入输出格式
输入格式:[输入数据:]
第一行为m n.(n为奇数),李大水牛一开始在最后一行的中间的下方
接下来为m*n的数字距阵.
共有m行,每行n个数字.数字间用空格隔开.代表该格子上的盘中的食物所能提供的能量.
数字全是整数.
输出格式:[输出数据:]
一个数,为你所找出的最大能量值.
输入输出样例
6 7 16 4 3 12 6 0 3 4 -5 6 7 0 0 2 6 0 -1 -2 3 6 8 5 3 4 0 0 -2 7 -1 7 4 0 7 -5 6 0 -1 3 4 12 4 2
41
说明
快吃!快吃!快吃!
分析:
简单的动态规划,虽然题目限制了是从最后一行中间位置下方开始向前方/左前方/右前方移动,但是并不影响DP。
注意循环时i要到m+1,因为初始位置不在餐桌上,而是在餐桌下方。
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 const int MAXN = 205; 7 8 inline void read(int &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 12 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 13 if(c == ‘-‘) x = -x; 14 } 15 16 inline int max(int a,int b) 17 {return a>b?a:b;} 18 19 int n,m,mp[MAXN][MAXN],f[MAXN][MAXN]; 20 21 int main() 22 { 23 read(m),read(n); 24 for(int i = 1;i <= m;++ i) 25 for(int j = 1;j <= n;++ j) 26 read(mp[i][j]); 27 for(int i = 1;i <= m+1;++ i) 28 for(int j = 1;j <= n;++ j) 29 f[i][j] = max(f[i-1][j-1],max(f[i-1][j+1],f[i-1][j]))+mp[i][j]; 30 printf("%d\n",f[m+1][(n+1)/2]); 31 return 0; 32 }
以上是关于洛谷 P1508 Likecloud-吃吃吃 题解的主要内容,如果未能解决你的问题,请参考以下文章