题目描述
解题思路
这题其实就是在每一列里找到一个最大的数,随时可以退出,最后输出最大值,我们可以用一个一维数组
d
p
dp
dp来保存当前第
i
i
i列中的最大得分,将当前的最大得分存在
a
n
s
ans
ans里,最后输出。
状态转移方程:
d
p
[
i
]
=
m
a
x
(
d
p
[
i
−
1
]
+
f
[
i
]
,
f
[
i
]
)
dp[i]=max(dp[i-1]+f[i],f[i])
dp[i]=max(dp[i−1]+f[i],f[i])
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int dp[20001],a[200][20001],f[20001],n,m;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<m;j++)
cin>>a[i][j];
for(int i=1;i<m;i++){
int ans=-100;
for(int j=1;j<=n;j++){
ans=max(ans,a[j][i]);
}
f[i]=ans;
}
int ans=-1000;
for(int i=1;i<m;i++){
dp[i]=max(dp[i-1]+f[i],f[i]);
ans=max(dp[i],ans);
}
cout<<ans;
return 0;
}