题目
思路
首先,这道题乍一看,应该可以用搜索来做。
但是,搜索会不会超时间限制呢?
为了防止时间超限,我们可以换一种做法。
先创立两个二维数组,一个是输入的数组a,一个是数组b。
假设 i 行 j 列的数是 a [ i ] [ j ],和b [ i ] [ j ]
输入的时候判断:如果 a [ i ] [ j ]<300,那么 a [ i ] [ j ] = a [ i ] [ j ] /2。
然后,b [ i ] [ j ] = a [ i ] [ j ].
如果学过小学奥数:标数法
那么,你会很好理解:
一排一排、从左到右的去处理:
走到 a [ i ] [ j ] 这处银子时,得到的银子总量为 a [ i ] [ j ] + max( b [ i - 1 ] [ j ] , b [ i ] [ j - 1 ]).将这个数存在 b [ i ] [ j ]中。
最后,只要输出 b [ n ] [ m ] 就好了
相信标数法你们都学过,因为它很简单,所以这里就不多解释这样写的原因了。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[110][110];
int b[110][110];
int main()
{cin>>n>>m;for(int i = 1;i<=n;i++){for(int j = 1;j<=m;j++){cin>>a[i][j];if(a[i][j]<300) a[i][j] /= 2;b[i][j] = a[i][j];}}for(int i = 1;i<=n;i++){for(int j = 1;j<=m;j++){b[i][j] += max(b[i-1][j],b[i][j-1]);}}cout<<b[n][m];return 0;
}