K. 冒险公社

题意:

  • 根据预测情况,求前 n 个岛最多的绿岛数

分析:

  • 没有思路的情况下,先想了一下暴力,O(3n)O(3^n)O(3n) 显然超时

    暴力枚举所有情况,每次都会考虑n个岛的具体颜色

    但实际上,对于每次预判我们只需要考虑当前岛和其前两个岛的颜色即可

    所以,考虑线性DP,枚举每三个岛的情况,记录状态,再状态转移即可

  • dp[i][y][z]dp[i][y][z]dp[i][y][z] 表示前 i 个岛,第i个岛颜色为z,第i-1个岛颜色为y的情况下,最多绿岛数,那么状态转移方程为,

    dp[i][y][z]=max(dp[y][z],dp[x][y]+(z==1));
    

    然后根据当前预测值分为三类情况考虑:(g表示三个岛绿岛数,r表示红岛数)

    • s[i]==‘R’:r>gr>gr>g 时才会进行状态转移

    • s[i]==‘G’:g>rg>rg>r 时,~~

    • s[i]==‘B’:g==rg==rg==r 时,~~

  • 坑点:最后答案为0时,也是合法情况,因此dp初值要赋为无穷小才能得到非法情况"-1"

#include <bits/stdc++.h>
using namespace std;const int N=1e5+5;
char s[N];
int dp[N][5][5];
void solve()
{int n;cin>>n>>s+1;memset(dp,-0x3f,sizeof(dp));// 预处理for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){int g=(i==1)+(j==1), r=(i==2)+(j==2);dp[2][i][j]=g;}}for(int i=3;i<=n;i++){for(int x=1;x<=3;x++)for(int y=1;y<=3;y++)for(int z=1;z<=3;z++){int g=(x==1)+(y==1)+(z==1), r=(x==2)+(y==2)+(z==2);if((g==r && s[i]=='B') || (g>r && s[i]=='G') || (g<r && s[i]=='R')){dp[i][y][z]=max(dp[i][y][z],dp[i-1][x][y]+(z==1));}}}int ans=-0x3f3f3f3f;for(int i=1;i<=3;i++){for(int j=1;j<=3;j++){ans=max(ans,dp[n][i][j]);}}if(ans>=0) cout<<ans<<endl;else cout<<-1<<endl;
}
signed main()
{int T=1;//cin>>T;while(T--) solve();
}

K. 冒险公社 (线性DP)相关推荐

  1. 【蓝桥杯官网试题 - 算法训练 】K好数(线性dp与优化)

    题干: 问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.2 ...

  2. 0x51.动态规划 - 线性DP(习题详解 × 10)

    目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...

  3. 洛谷P2401 不等数列(线性DP)

    本题使用的是线性DP.就是DP数组难以思考,这里我直接给出 dp[i][j]:表示 1 ~ i 这 i 个数 , 其中j 个 " < " 有几种方法 假设我们已经把 n - ...

  4. POJ - 1050 To the Max(最大连续子段和,线性dp)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵,每个点都有一个权值,现在要从中选取一个子矩阵要求权值和最大,问这个最大权值和是多少 题目分析:因为是要求子矩阵的权值和最大的问题,我们可以直接维护一 ...

  5. 牛客 - 「火」皇家烈焰(线性dp)

    题目链接:点击查看 题目大意:给出一个字符串表示扫雷游戏,其中: 0:这个格子没有烈焰,且其左右两个格子均没有烈焰 1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰 2:这个格子没有烈焰,且其左右 ...

  6. CH 5102 Mobile Service(线性DP)

    CH 5102 Mobile Service \(solution:\) 这道题很容易想到DP,因为题目里已经说了要按顺序完成这些请求.所以我们可以线性DP,但是这一题的状态不是很好设,因为数据范围有 ...

  7. 【动态规划】线性dp P1043 数字游戏

    思路: 这题和 [动态规划]P1018 线性dp:乘积最大_m0_52043808的博客-CSDN博客 十分类似,都是把一组数分成固定的部分,然后对分好的数进行特定的操作,求操作后所得的最值 所以,两 ...

  8. POJ3666 线性dp+维度优化

    POJ3666 线性dp+维度优化 题面 POJ3666 题面 思路 首先是重要的归纳法寻求思路的思想,在满足S最小化的前提下,假设存在一种构造前k位序列B的方案,即已经构造B1B2⋯BkB_1B_2 ...

  9. P1772 [ZJOI2006]物流运输(线性dp+最短路径)

    P1772 [ZJOI2006]物流运输 题意 [ZJOI2006]物流运输 题目描述 物流公司要把一批货物从码头 A 运到码头 B.由于货物量比较大,需要 nnn 天才能运完.货物运输过程中一般要转 ...

  10. 寒假算法学习 OI生涯 - 悄无声息(模拟+线性DP优化) OI生涯 - 德国心脏病 (模拟)

    OI生涯 - 悄无声息 题目描述 「李」走路是没有动静的,如果你在干「李」不让你干的事情,他会神不知鬼不觉的走到你的身后,然后把你奶一顿! 因为你知道「李」走路没有动静,所以为了提防,可以认为「李」有 ...

最新文章

  1. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现
  2. oracle pl sql示例,oracle PL SQL学习案例(一)
  3. docker容器修改开机启动服务器,docker-修改容器挂载目录的3种方法小结
  4. CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths 树启 + 状压
  5. mamp安装php扩展,向MAMP添加GMP PHP扩展
  6. MongoDB学习笔记—02 MongoDB入门
  7. 像MIUI一样做Zabbix二次开发(5)——那些坑和优化方向
  8. 微信公众号新手运营指南——公众号后台常用功能介绍
  9. 鲍斯科机器人_芜湖鲍斯柯机器人有限公司、上海富治机械科技有限公司服务合同纠纷二审民事判决书...
  10. 漫反射(diffuse reflection)
  11. P2P加速系统解决方案
  12. C语言再学习 -- 关键字return和exit ()函数
  13. eclipes error
  14. 跨域 万金油解决方法 非原理向
  15. mysql打平子表_股民网友加入散户家园的流程表
  16. vue给标签动态添加元素_vue页面动态添加元素
  17. 《穷查理宝典》教会我的
  18. 罗氏线圈的电流变送器
  19. 【转】愤怒的小鸟 PC汉化版
  20. python爬虫02-urllib使用和简版爬虫案例

热门文章

  1. 英雄联盟lol鼠标突然不能a兵了
  2. 近期你已经授权登录过_原来我的微信、QQ 授权登录过这么多应用!(附查找及解绑方法)...
  3. win7系统服务优化——服务列表禁止项
  4. 化合物修饰壳聚糖水凝胶:丙烯酸接枝/聚乙烯醇/温敏淫羊藿苷/醛-亚胺-壳聚糖水凝胶的制备
  5. 金山词霸不断的弹出窗口(金山词霸防欺诈提示),犹如病毒软件
  6. 联想服务器安装系统鼠标失灵,ThinkPad自行安装操作系统后键盘鼠标失灵怎么办...
  7. matlab 图像上加边框,matlab代码-图像上画框 | 学步园
  8. Spinnaker第七节—Orca代码详解
  9. 【前端】【HTML+CSS+JavaScript(JS)】简易登陆界面的实现
  10. 我只想说“独孤求败”与“东方不败”是不同的!