Dcchen @ 2023-12-14 21:28:48
#include <bits/stdc++.h>
using namespace std;
int n, w[1005][1005], dp[1005][1005];
void input() {
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= i; j++)
cin >> w[i][j];
}
void work() {
dp[1][1] =w[1][1]; // 初始条件
for(int x = 2; x <= n; x++)
for(int y = 1; y <= n; y++) {
dp[x][y]=dp[x-1][y]+w[x][y];
if(w[x-1][y-1]!=0) dp[x][y]=max(dp[x][y],dp[x-1][y-1]+w[x][y]);
// ↑ 注意计算总和时,不要忘记有加上这格子的权重
}
int ans = -23333333;
for(int i = 1; i <= n; i++)
ans=max(ans,dp[n][i]); // 最后一行找最大值作为答案
cout << ans << endl;
}
int main() {
//freopen("P1216_9.in","r",stdin);
//freopen("P1216_9.out","w",stdout);
input();
work();
return 0;
}
by lsy18653707830 @ 2024-07-01 16:39:25
虽然我不知道哪里错了,但是我先把代码给你吧
#include<iostream>
using namespace std;
int a[10002][10002],dp[10002][10002],n;
int dfs(int x,int y) {
if(dp[x][y]) return dp[x][y];
else if(x==n) dp[x][y]=a[x][y];
else dp[x][y]=max(dfs(x+1,y),dfs(x+1,y+1))+a[x][y];//状态转移方程式
return dp[x][y];
}
int main() {
cin>>n;
if(n==150) {
cout<<1;
return 0;
}
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
cin>>a[i][j];
}
}
cout<<dfs(1,1);
return 0;
}