二刷提高课,题解目录在这里— 提高课的题解目录
此题目为经典的线性dp,作为提高课DP的开篇
这里讲解一下何为线性dp,线性dp往往指在一个序列上进行的dp,当然也可能有两个甚至多个序列。
其实就是最为基本的dp,我们可以想一下
以前遇见的完全背包问题,在没有优化前,状态转移方程很长,
或者需要多次转移,就可以想象一下这既是线性dp
而在此题目中,一个位置可能会有上面两个位置传递而来,所以就是一种线性体现
(大部分的dp都是线性dp)
#include<iostream>
#include<cstring>
using namespace std;
const int N=110;
int f[N][N],g[N][N];
int n,m;
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>g[i][j];
}
memset(f,0,sizeof f);
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];
}
}
cout<<f[n][m]<<endl;
}
}