问题标题: 酷町堂:4400

0
0
已解决
胡景波
胡景波
中级光能
中级光能

4400   捡金币经验值:1200

题目描述 Description

小P路过一个N*M个格子大小的房间,房间的每个格子上都放有一定数量的金币。现在小P在这个房间的左上角,只能向下或向右移动,每次移动一格。每次经过某一个格子都可以捡起格子中的金币。
请你帮小P选择一条到达右下角的路,使得在移动的过程中能够捡到最多的金币。

输入描述 Input Description

第一行:N M ,表示房间是由一个N*M的格子组成
接下来有N行:每行有M个正整数,Xi1 Xi2 ……Xim 表示各位置中的金币数(单个空格隔开)

输出描述 Output Description

输出有一个整数, 表示小P捡到最多的金币数

样例输入 Sample Input

3 4 3 1 2 8 5 3 4 6 1 0 2 3

样例输出 Sample Output

24

数据范围及提示 Data Size & Hint

1≤N M≤20,0≤Xij≤500

#include<iostream>
using namespace std;
int m,n,f[1005][1005],a[105][105];
int main(){
    cin>>m>>n;
    for(int i=1;i<=m;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    f[1][1]=a[1][1];
    for(int i=2;i<=m;i++){
        for(int j=1;j<=n;i++){
            if(j==1){
                f[i][j]=f[i-1][j]+a[i][j];
            }
            else f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];
        }
    }
    cout<<f[m][n];
    return 0;
}


0
已采纳
褚俊皓
褚俊皓
新手天翼
新手天翼

数塔问题

核心:

for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(i==1&&j==1) f[1][1]=a[1][1];
            else if(i==1){
                f[i][j]=f[i][j-1]+a[i][j];
            }
            else if(j==1){
                f[i][j]=f[i-1][j]+a[i][j];
            }
            else f[i][j]=max(f[i-1][j],f[i][j-1])+a[i][j];
        } 
    }
勿抄袭

注:我是先输入n再输入m的

0
0
0
0
0
0
我要回答