【ACWing 1015.】摘花生 (线性dp)

题目链接

题目中说了,只能向东或向南走,也就是向右或向下走,那么点(x,y)只能由其上面的点(x-1,y)和左边的点(x,y-1)转移而来,那么设f[i][j]为走到第i行第j列时所摘的花生数,那么转移方程就是f[i][j] = max(f[i-1][j],f[i][j-1]) + g[i][j],具体请看代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int N = 110;
int g[N][N],n,m;
int f[N][N];
int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&g[i][j]),f[i][j] = 0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                f[i][j] = max(f[i-1][j],f[i][j-1]) + g[i][j];
        printf("%d\n",f[n][m]);
    }
    return 0;
}

上一篇:spark内核与源码


下一篇:流程