首页 > 其他分享 >花园改造 题解

花园改造 题解

时间:2024-08-06 16:50:13浏览次数:7  
标签:满意度 max 大树 题解 位置 改造 花园 dp define

题目id:9989

题目描述

小\(X\)开始改造她的环形的花园了,具体来说她要在花园的环上种满\(n\)棵树。她现在有\(3\)种树:种子、小树苗和大树。每个位置上种不同的树会产生不同的满意度,具体来说在第\(i\)个位置,种种子会产生\(a_i\)的满意度,种小树苗会产生\(b_i\)的满意度,种大树会产生\(c_i\)的满意度。为了获取最大的满意度之和,她只要在每个位置种上该位置满意度最大的树就行了。但是附近的巫婆告诉她,种子的边上(距离为\(1\)的相邻,下同)不能有种子,大树的边上不能有大树,小树苗的边上要么都是种子、要么都是大树,不然花园所有树不久就会枯死。小\(X\)当然不允许这种事情发生,所以她就向小\(Q\)求助了。可惜的是小\(Q\)也不知道应该怎么做,请聪明的你帮帮他吧。
注意哦,花园是环形的,也就是说第1个位置的边上不只是第2个位置,还有第\(n\)个位置;第\(n\)个位置的边上不只是第\(n-1\)个位置,还有第\(1\)个位置。

解题思路

一眼\(dp\)题。
设\(dp_{i,j,k}\)为在第\(i\)个位置用了第\(j\)种树(种子\(/\)小树苗\(/\)大树)比旁边位置高\(/\)矮\((k\)用\(0\)或\(1\)表示,\(0\)表示矮,\(1\)表示高\()\)
四个状态转移方程式分别为:
dp[i][0][0]=max(dp[i-1][1][1],dp[i-1][2][1])+a[i][0];
dp[i][1][0]=dp[i-1][2][1]+a[i][1];
dp[i][1][1]=dp[i-1][0][0]+a[i][1];
dp[i][2][1]=max(dp[i-1][1][0],dp[i-1][0][0])+a[i][2];
\(ans\)对\(dp_{n,i,0}\)和\(dp_{n,i,1}\)取\(\max\)即可。

AC Code

#include<bits/stdc++.h>
#define N 1000007
#define INF 1e18
#define MOD 998244353
#define LL long long
#define pb push_back
#define lb long double
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define IOS ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
LL n,a[N][3],dp[N][4][2],ans;
int main()
{
    IOS;
    cin>>n;
    for(int i=1;i<=n;++i)
        for(int j=0;j<3;++j)
            cin>>a[i][j];
    for(LL j=0;j<3;++j)
    {
        for(LL i=0;i<3;++i)
            for(LL k=0;k<2;++k)dp[1][i][k]=0;
        dp[1][j][0]=dp[1][j][1]=a[1][j];
        for(int i=2;i<=n;++i)
        {
            dp[i][0][0]=max(dp[i-1][1][1],dp[i-1][2][1])+a[i][0];
            dp[i][1][0]=dp[i-1][2][1]+a[i][1];
            dp[i][1][1]=dp[i-1][0][0]+a[i][1];
            dp[i][2][1]=max(dp[i-1][1][0],dp[i-1][0][0])+a[i][2];
        }
        for(int i=0;i<j;++i)ans=max(ans,dp[n][i][0]);
        for(int i=2;i>j;--i)ans=max(ans,dp[n][i][1]);
    }
    cout<<ans;
    return 0;
}

标签:满意度,max,大树,题解,位置,改造,花园,dp,define
From: https://www.cnblogs.com/988176-/p/18345555

相关文章

  • [AGC005B] Minimum Sum 题解
    题目传送门看到这道题很多人用单调栈,其实用笛卡尔树本质差不多,但是思维难度更小。不知道笛卡尔树的同学可以看这里简单说来,笛卡尔树的一个子树可以代表一个区间,且左子树上点的下标小于根节点,右子树上点的坐标大于根节点。这道题要求所有子区间的\(\texttt{min}\)值之和,其实......
  • Jmeter源码改造之-脚本执行&定制报告&定制Jmeter弹框
    承接上一篇:Jmeter源码改造之-自动化生成性能测试脚本_自动生成jmx-CSDN博客假如你已经有了Jmeter源码开发环境,就可以通过代码去执行压测脚本(当然,界面、dos窗口命令/Linux命令、Jenkins等方式也都能实现脚本执行),还可以通过代码去解析.jtl结果文件来生成你想要的测试报告,并定制......
  • Jmeter源码改造之-定制Jmeter菜单
    随着Jmeter工具的不断深入应用,大家很有可能会遇到Jmeter无法解决的问题,或者想优化现有的Jmeter功能来满足不断变化的业务需求。最常见的,我们想自定义一些函数给Jmeter去调用,这个时候就需要对源码进行解析和改造。还有一种情况,我们想定制一下Jmeter的菜单,来实现一些特定功能......
  • 迟钝的舞会 题解
    题目id:1329题目描述牛是公认的笨拙的舞者。然后,约翰发现富有音乐细胞的母牛能产更多的奶。因此,他把他的整圈的牛都拉进了舞蹈培训班,包括所有的公牛(因为跳舞的时候得一男一女-_-)。这些牛正好有\(n\)头是公的,有\(n\)头是母的。在第一堂课开始之前,舞蹈老师想将他们分成一对一对的(......
  • 08-04 题解
    08-03题解A根据题目的提示,发现所有数的积是不变的(\(gcd(a,b)*lcm(a,b)=a*b\)),所以差大和大简易证明设\(g=gcd(a,b)\),则\(a=a'g,\)\(b=b'g\),\(lcm(a,b)=a'b'g\)\(gcd(a,b)+lcm(a,b)=g(1+a'b')\)\(a+b=g(a'......
  • 08-02 题解
    <head><scriptsrc="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"type="text/javascript"></script><scripttype="text/x-mathjax-config">MathJax.Hub.Co......
  • ARC152C 题解
    blog。可能是很简单的,但是我实在是不会这种神秘题/ll/ll。Conclusion1.记\(d=a_n-a_1\),则极差始终等于\(d\)。证明显然。Conclusion2.操作极值时,最小值始终变化为\(d\),并且可以进行无限次这样的变化。证明显然。题意转变:最小化\((\texttt{最小值}\bmodd)\),且最小......
  • AISING2020E 题解
    blog。没题解就来写一篇捏。显然\(L_i>R_i\)的人都想去左边(记为LFT人),\(L_i<R_i\)的人都想去右边(记为RHT人),\(L_i=R_i\)的人可以摆烂。(LFT人与RHT人互相干扰,很难刻画。于是找性质。)存在最优方案,使得所有LFT人都在RHT人的左边。证明:如果有RHT人在LFT人的左边,......
  • pbootcms网站后台关闭验证码后, 无法登录问题解决方法
    最近闲来无事,在后台将pbootcms的登录验证码关闭了(全局配置-配置参数-安全配置-后台验证码)结果问题来了,第二天登录后台一直提示验证码不能为空。 这不是自己给自己找事吗!现在想输入验证码,也没有地方输入。 从程序上解决吧 apps\admin\controller\IndexController.ph......
  • 【题解】Solution Set - 新高一矩阵选讲「陶治霖」
    新高一矩阵选讲「陶治霖」https://www.becoder.com.cn/contest/5348「CF1970E3」Trails(Hard)考虑DP。定义\(f_{i,j}\)表示,第\(i\)天走到\(j\)的方案数。有转移:\[f_{i,j}=\sum_{k=1}^mf_{i-1,k}\times(s_jl_k+s_kl_j+s_js_k)\]https://www.luogu.com.cn/article/i......