我是靠谱客的博主 执着夕阳,最近开发中收集的这篇文章主要介绍dp——poj2.6基本算法之动态规划【2728:摘花生】一、题目描述二、解题思路三、代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、题目描述

题目链接

二、解题思路

因为只是一道多阶段最优化决策问题,虽然它长得有点像dfs或者bfs,但是用那两种方法就会无情的超时,此时注意:dijkstra的话可以返回(就是它会把所有的花生都算上),结合这四种算来看,动态规划的做法是最优的,所以就要采用动态规划来做这道题。

1、数学建模

令dpi,j表示第i行,第j列的最多可以获得的最多的花生的数量。

dp数组12
112
248

ans=dp2,2=8

dp数组123
1259
231116

ans=dp2,3=16

2、状态转移方程

从上面列的表来看,很容易找到规律,其状态转移方程如下:

dpi,j=max(dpi-1,j,dpi,j-1)+Ai,j

原因

其实原因也很好想,因为每一次的选择路径只能从上面或者右面达到这个点,所以这个点的最大的能够得到的花生的数量就与上面的点和左面的点有关,而且,也与自己的花生的数量有关,就得到了上面的式子。

注意

在循环求解(递推)是要注意,只能从上到下,从左到右枚举dp数组。

3、边界(初始化)

其实只要当dp0,j=dpi,0=0时,就可以了,也可以把dp1,1算出来,两种方法都可以。

三、代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T,n,m,A[110][110],dp[110][110];
int main()
{
scanf("%d",&T);
while(T--)
{
memset(dp,-1,sizeof(dp));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&A[i][j]);
dp[1][1]=A[1][1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(dp[i][j]==-1)
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+A[i][j];
}
}
printf("%dn",dp[n][m]);
}
return 0;
}

最后

以上就是执着夕阳为你收集整理的dp——poj2.6基本算法之动态规划【2728:摘花生】一、题目描述二、解题思路三、代码的全部内容,希望文章能够帮你解决dp——poj2.6基本算法之动态规划【2728:摘花生】一、题目描述二、解题思路三、代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部