44分--求助!!!

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

Yangtian_17BEAR @ 2023-06-27 16:16:23

#include<bits/stdc++.h>
using namespace std;
int n,a[1029][1932],w[2923][1103],maxn=-27272288;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)cin>>a[i][j];
        a[1][1]=w[1][1];
    for(int i=2;i<=n;i++)
        for(int j=1;j<=n;j++){
            w[i][j]=w[i][j-1]+a[i][j];
            if(i!=1&&j!=1)w[i][j]=max(w[i][j],w[i-1][j-1]+a[i][j]);
        }
    for(int j=1;j<=n;j++)maxn=max(maxn,w[j][n]);
    cout<<maxn;
    return 0; 
}

44分,求————助


by _M1Ku_ @ 2023-06-27 16:45:08

#include<bits/stdc++.h>
using namespace std;
int n,a[1029][1932],w[2923][1103],maxn=-27272288;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)cin>>a[i][j];
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++){
            w[i][j]=max(w[i-1][j] + a[i][j],w[i-1][j-1]+a[i][j]);
        }
    for(int j=1;j<=n;j++)maxn=max(maxn,w[n][j]);
    cout<<maxn;
    return 0; 
}

by _M1Ku_ @ 2023-06-27 16:50:31

@Yangtian_17BEAR

第一个错误:a[1][1]=w[1][1]反了
应该是:w[1][1]=a[1][1]
第二个错误:
统计答案时: 
for(int j=1;j<=n;j++)maxn=max(maxn,w[j][n]);
不是w[j][n]这样是统计的1-n行的第n列
应给是:w[n][j]
另外,递推的时候,第二个循环j最好是小于等于i
递推过程中的判断没有必要,去掉也不会RE,因为i==1或j==1时,i-1 j-1为0,不会越界,并且不会影响答案统计

by _M1Ku_ @ 2023-06-27 16:51:19

给个关注行吗


by Yangtian_17BEAR @ 2023-06-27 16:51:27

哦,谢谢谢谢


by Yangtian_17BEAR @ 2023-06-27 16:59:43

@Miku_Fan 请问是这样改吗


#include<bits/stdc++.h>
using namespace std;
int n,a[1029][1932],w[2923][1103],maxn=-27272288;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)cin>>a[i][j];
        w[1][1]=a[1][1];
    for(int i=2;i<=n;i++)
        for(int j=1;j<=i;j++){
            w[i][j]=w[i][j-1]+a[i][j];
            if(i!=1&&j!=1)w[i][j]=max(w[i][j],w[i-1][j-1]+a[i][j]);
        }
    for(int j=1;j<=n;j++)maxn=max(maxn,w[n][j]);
    cout<<maxn;
    return 0; 
}

by _M1Ku_ @ 2023-06-27 18:05:07

@Yangtian_17BEAR 递推过程中还是错了,忘给你说了抱歉


#include<bits/stdc++.h>
using namespace std;
int n,a[1029][1932],w[2923][1103],maxn=-27272288;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=i;j++)cin>>a[i][j];
        w[1][1]=a[1][1];
    for(int i=2;i<=n;i++)
        for(int j=1;j<=i;j++){
            w[i][j]=w[i][j-1]+a[i][j]; //这里错了,应该是w[i][j]=w[i-1][j]+a[i][j]
            if(i!=1&&j!=1)w[i][j]=max(w[i][j],w[i-1][j-1]+a[i][j]);
        }
    for(int j=1;j<=n;j++)maxn=max(maxn,w[n][j]);
    cout<<maxn;
    return 0; 
}

|