社区讨论
求助,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 条回复,欢迎继续交流。
正在加载回复...