社区讨论

求助,90分,第一个点错了

P1133教主的花园参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo2xtym4
此快照首次捕获于
2023/10/23 21:32
2 年前
此快照最后确认于
2023/10/23 21:32
2 年前
查看原帖
当输入
6
1 3 2
3 1 2
1 2 3
1 3 2
2 1 3
2 3 2
应该输出17,但是我的输出18。。。
CPP
#include <bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int n,ans;
int a[MAXN],b[MAXN],c[MAXN]; //a[i]:第一种树种在第i的位置时的价值
int f[MAXN][5][5]; //i:which pos j:which tree k(last one):is the tree around bigger or smaller
void input(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d%d%d",&a[i],&b[i],&c[i]);
}
int main()
{
    input();
    for(int j=1;j<=3;j++){
        if(j==1) f[1][j][1]=f[1][j][2]=a[1];
        if(j==2) f[1][j][1]=f[1][j][2]=b[1];
        if(j==3) f[1][j][1]=f[1][j][2]=c[1];
        for(int i=2;i<=n;i++){
            f[i][1][1]=max(f[i-1][2][2],f[i-1][3][2])+a[i];
            f[i][2][1]=f[i-1][3][2]+b[i];
            f[i][2][2]=f[i-1][1][1]+b[i];
            f[i][3][2]=max(f[i-1][2][1],f[i-1][1][1])+c[i];
        }
        int cnt;
        for(int t=1;t<j;t++){
            if(ans<f[n][t][1]) ans=f[n][t][1],cnt=t;
        }
        for(int t=3;t>j;t--){
            if(ans<f[n][t][2]) ans=f[n][t][2],cnt=t;
        }
        cout<<j<<" "<<cnt<<endl;
    }
    printf("%d\n",ans);
    
    
    

    return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...