简单动态规划

1765: 小明的探险(双周练)

描述

题目描述:

小明在一个大小为M×N的山洞里寻宝,初始时他在左上角。由于他没上过高中,所以只能向下或者向右走,其中有一些点不能通过,其他每个点都有宝藏,价值为一正数,小明经过该点时会自动拿起宝藏。

问从左上角((0,0)点)到右下角((M-1,N-1)点),小明所能拿到宝藏的最大值是多少?

输入:

第一行两个数,M和N,表示M行N列。(0<M<=30,0<=N<=30)

接下来M行,每行N个数,表示山洞情况,其中:

-1表示障碍点,其他正数表示该点的宝藏的价值

输入保证(0,0)和(M-1,N-1)点没有障碍

输出:

输出宝藏价值的最大值。

如果小明不能到达右下角,

输出“Xiao Ming is a stupid boy”(无引号)

样例输入
4 5
1 2 3 4 5
6 7 8 9 10
5 4 3 2 1
10 9 8 7 6
样例输出

52

每次看到这种题的思想都是搜索,感觉先入为主了。。

一定要培养动归思想

#include<bits/stdc++.h>
using namespace std;
const int inf = -999999;
int dp[105][105];
int a[105][105];
int main()
{
    int n, m, i, j;
    cin >> m >> n;
    for( i=1; i <= m; i++)
    {
        for( j =1; j <= n; j++)
        {
            scanf("%d", &a[i][j]);
            if(a[i][j] == -1)
            a[i][j] = inf;
        }
    }
    
    for( i =1; i <= m; i++)
    {
        for( j =1; j <= n; j++)
        {
        		if(i == 1)
        		{
        			dp[i][j] = a[i][j] + dp[i][j - 1];
				}
				else if(j == 1)
				{
					dp[i][j] = a[i][j] + dp[i - 1][j];
				}
				else
            		dp[i][j]  =max( dp[i - 1][j]+a[i][j], dp[i][j - 1]+a[i][j]);
				
		}
    }
    if(dp[m][n] > 0)
    cout << dp[m][n] << endl;
	else
	cout << "Xiao Ming is a stupid boy" << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/soul_97/article/details/80312031