ZBXALQX @ 2024-01-27 12:57:27
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,w;
cin>>n;
int a[n+1][n+1]={};
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)cin>>a[i][j];
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
a[i][j]+=max(a[i-1][j-1],a[i-1][j]);
}
}
for(int i=1;i<=n;i++){
w=max(w,a[n][i]);
}
cout<<w;
return 0;
}
听取wa声一片
by timmyliao @ 2024-01-27 13:07:16
AC
#include<bits/stdc++.h>
#define ll long long
#define endl '\n'
using namespace std;
const int N=1e5+5;
int m[1005][1005];
int dp[1005];
int main()
{
ios_base::sync_with_stdio(NULL);
cin.tie(NULL),cout.tie(NULL);
int n;
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<i+1;j++)
cin>>m[i][j];
for(int i=0;i<n;i++)
dp[i]=m[n-1][i];
for(int i=n-2;i>=0;i--)
{
for(int j=0;j<i+1;j++)
dp[j]=max(m[i][j]+dp[j],m[i][j]+dp[j+1]);
}
cout<<dp[0]<<endl;
return 0;
}
by ZBXALQX @ 2024-01-27 13:13:13
@timmyliao 我表示:看不懂
by 1612855242ytq @ 2024-01-27 13:30:36
应该是从下往上加,
a[i][j]+=max(a[i-1][j-1],a[i-1][j]);
这个循环很明显写反了
by timmyliao @ 2024-01-27 13:54:47
@ZBXALQX 我用的是DP
by ZBXALQX @ 2024-01-27 14:04:02
@1612855242ytq 那是怎么样的呢?你打的和我是一样的
by ZBXALQX @ 2024-01-27 14:38:26
现在已经60分了
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,w;
cin>>n;
int a[105][1005]={};
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)cin>>a[i][j];
for(int i=2;i<=n;i++){
for(int j=1;j<=i;j++){
a[i][j]+=max(a[i-1][j-1],a[i-1][j]);
}
}
for(int i=1;i<=n;i++){
w=max(w,a[n][i]);
}
cout<<w;
return 0;
}
by 1612855242ytq @ 2024-01-28 17:20:53
你考虑一下,如果从下往上走的话不久简单了吗
对于上面的节点,下方都有两条路,只要选择数字大的那条路,从最下面比到最上面就行了
主要代码:
for(int i=n-1;i>=1;--i)
for(int j=1;j<=i;++j)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
答案就是a[1][1]了
可能哪写错了,但大致思路都体现出来了