样例过了,0分求助!!!

P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles

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]了

可能哪写错了,但大致思路都体现出来了


|