P1133 教主的花园
题目描述
教主有着一个环形的花园,他想在花园周围均匀地种上 nnn 棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值。
教主最喜欢 333 种树,这 333 种树的高度分别为 10,20,3010,20,3010,20,30。教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高。
输入格式
第一行为一个正整数 nnn,表示需要种的树的棵数。
接下来 nnn 行,每行 333 个不超过 100001000010000 的正整数 ai,bi,cia_i,b_i,c_iai,bi,ci,按顺时针顺序表示了第 iii 个位置种高度为 10,20,3010,20,3010,20,30 的树能获得的观赏价值。
第 iii 个位置的树与第 i+1i+1i+1 个位置的树相邻,特别地,第 111 个位置的树与第 nnn 个位置的树相邻。
输出格式
一个正整数,为最大的观赏价值和。
输入输出样例 #1
输入 #1
4
1 3 2
3 1 2
3 1 2
3 1 2
输出 #1
11
说明/提示
【样例说明】。
第 111 至 nnn 个位置分别种上高度为 20,10,30,1020,10,30,1020,10,30,10 的树,价值最高。
【数据规模与约定】。
- 对于 20%20\%20% 的数据,有 n≤10n\le 10n≤10;
- 对于 40%40\%40% 的数据,有 n≤100n\le 100n≤100;
- 对于 60%60\%60% 的数据,有 n≤1000n\le 1000n≤1000;
- 对于 100%100\%100% 的数据,有 4≤n≤1054\le n\le 10^54≤n≤105,并保证 nnn 一定为偶数。
C++实现
#include<bits/stdc++.h>
using namespace std;
const int N = 100000+5;
const int inf = 1e9;
int n, ans;
int dp[N][5]; // 1: 10 20/30; 2: 10 20 10; 3: 30 20 30; 4: 30 10/20;
int v[N][4]; // 1: 10; 2: 20; 3: 30;
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
scanf("%d%d%d", &v[i][1], &v[i][2], &v[i][3]);
for(int j = 1; j <= 4; j++) {
memset(dp, 0, sizeof dp);
for(int i = 1; i <= 4; i++)
dp[1][i] = -inf;
if(j == 1) dp[1][j] = v[1][1];
if(j == 2) dp[1][j] = v[1][2];
if(j == 3) dp[1][j] = v[1][2];
if(j == 4) dp[1][j] = v[1][3];
for(int i = 2; i <= n; i++) {
dp[i][1] = max(dp[i-1][2], dp[i-1][4]) + v[i][1];
dp[i][2] = dp[i-1][1] + v[i][2];
dp[i][3] = dp[i-1][4] + v[i][2];
dp[i][4] = max(dp[i-1][1], dp[i-1][3]) + v[i][3];
}
if(j == 1) ans = max(dp[n][2], max(ans, dp[n][4]));
if(j == 2) ans = max(ans, dp[n][1]);
if(j == 3) ans = max(ans, dp[n][4]);
if(j == 4) ans = max(dp[n][1], max(ans, dp[n][3]));
}
cout<<ans<<endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P1133 教主的花园&spm=1001.2101.3001.5002&articleId=154901691&d=1&t=3&u=8a5a1ae107ef4f8580ef13246e0bb4b8)

被折叠的 条评论
为什么被折叠?



