打卡信奥刷题(2394)用C++实现信奥 P1133 教主的花园

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

说明/提示

【样例说明】。

111nnn 个位置分别种上高度为 20,10,30,1020,10,30,1020,10,30,10 的树,价值最高。

【数据规模与约定】。

  • 对于 20%20\%20% 的数据,有 n≤10n\le 10n10
  • 对于 40%40\%40% 的数据,有 n≤100n\le 100n100
  • 对于 60%60\%60% 的数据,有 n≤1000n\le 1000n1000
  • 对于 100%100\%100% 的数据,有 4≤n≤1054\le n\le 10^54n105,并保证 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值