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; }