原题链接:https://www.acwing.com/problem/content/1017/
图源:https://www.acwing.com/solution/content/49332/
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110;
int w[N][N];
int f[N][N];
int main()
{
int T;
cin>>T;
while(T--)
{
int n, m;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &w[i][j]);
//按照拓扑序枚举即可
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])+w[i][j];
cout<<f[n][m]<<endl;
}
return 0;
}
滚动数组优化: 好像没啥用。。。
单数&1就是用数组第1行,双数就是第2行(3&1=1,2&1=0),开了一个两行的数组。
#include<cstring>
#include<iostream>
using namespace std;
const int N = 105;
int a[2][N], f[2][N], q, n, m;
int main()
{
cin >> q;
while(q--){
cin >> n >> m;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
cin >> a[i&1][j];
f[i&1][j] = max(f[i&1][j-1], f[(i-1)&1][j]) + a[i&1][j];
}
}
cout << f[n&1][m] << endl;
memset(f, 0, sizeof f);
}
}
作者:dasongshu
链接:https://www.acwing.com/solution/content/8422/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
继续优化:
#include<cstring>
#include<iostream>
using namespace std;
const int N = 105;
int a[N][N], f[N], q, n, m;
int main()
{
cin >> q;
while(q--){
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 <= n; i++){
for(int j = 1; j <= m; j++){
f[j] = max(f[j], f[j-1]) + a[i][j];
}
}
cout << f[m] << endl;
// 由于多组样例,而二维数组解法由于f[0][...]和f[...][0]都为0,所以没有问题。对于一维数组,上一样例的f数组需要清零,否则影响结果
memset(f, 0, sizeof f);
}
}
作者:dasongshu
链接:https://www.acwing.com/solution/content/8422/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。