#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n; int num;
vector<vector<int>>arr;
cin >> n;
for (int i = 0; i < n; i++) {
arr.push_back(vector<int>());
for (int j = 0; j < i + 1; j++) {
cin >> num;
arr[i].push_back(num);
}
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < i + 1; j++) {
if (j == 0 ) {
arr[i][j] += arr[i - 1][j];
}
else if (j == i - 1) {
arr[i][j] += arr[i - 1][j - 1];
}
else {
arr[i][j] += max(arr[i - 1][j], arr[i - 1][j - 1]);
}
}
}
auto mmax = max_element(arr[n - 1].begin(), arr[n - 1].end());
cout << *mmax << endl;
}
这是我当时的代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[1005][1005],f[1005][1005],ans;
//f[i][j]表示包含i行j列的最大值
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)//三角形嘛!
{
scanf("%d",&a[i][j]);
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
}
}
for(int i=1;i<=n;i++) //原因 is The same of 最长上升子序列
{
ans=max(f[n][i],ans);
}
printf("%d",ans);
}
试试下面的代码:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n;
string num;
vector<vector<int>> arr;
getline(cin, n);
for (int i = 0; i < n; i++) {
arr.push_back(vector<int>());
for (int j = 0; j < i + 1; j++) {
// 修改此处
getline(cin, num);
arr[i].push_back(num);
}
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < i + 1; j++) {
if (j == 0 ) {
// 修改此处
arr[i][j] += arr[i - 1][j];
}
else if (j == i - 1) { // 修改此处
arr[i][j] += arr[i - 1][j - 1];
}
else {
arr[i][j] += max(arr[i - 1][j], arr[i - 1][j - 1]);
}
}
}
auto mmax = *max_element(arr[n-1].begin(), arr[n-1].end());
cout << mmax << endl;
return 0;
}
不知道你这个问题是否已经解决, 如果还没有解决的话: