链接:

P3147 P3146双倍经验


前言:

今天发现的一道很有意思的DP题


分析:

第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并且n的范围也不支持。

于是想贪心,但是贪着贪着发现自己想不出,于是看题解,发现唯一的贪心也被hack了,果然正解不是贪心。 决定放弃。

于是回头重新看题分析,首先根据n的范围分析后可以发现答案范围很小,最大为58,又回到刚开始的区间DP,我们发现其中有三个关键值,左端点,右端点和答案,那么我们可以尝试改变思路,将范围小的答案放进状态里,范围大的端点位置拿出来一个。

则设f[i][j]为左端点为i,答案为j时的右端点。

转移方程即为f[i][j]=f[f[i][j-1]+1][j-1]


代码:
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int a[262145];
int f[262145][60];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
f[i][a[i]]=i;//将单个数字视为左端点等于右端点
}
for(int j=2;j<=58;j++)
for(int i=1;i<=n;i++){
if(!f[i][j]&&f[i][j-1])
f[i][j]=f[f[i][j-1]+1][j-1]; /*f[i][j]==0,右端点为0意为合不出,则尝试合成,
合成的前提是f[i][j-1]即能够合出j-1*/ if(f[i][j])ans=i; //能够合出j则更新ans
}
cout<<ans<<endl;
return 0;
}

题外话:

虽然代码很少,但是非常精妙,蕴含了DP的一些小技巧,即尝试改变状态。 虽然这个DP它看起来可能很怪。

洛谷 P3147 [USACO16OPEN]262144 P的更多相关文章

  1. 洛谷P3147 [USACO16OPEN]262144

    P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...

  2. 洛谷 P3147 [USACO16OPEN]262144

    P3147 [USACO16OPEN]262144 题目描述 Bessie likes downloading games to play on her cell phone, even though ...

  3. P3147 [USACO16OPEN]262144

    P3147 [USACO16OPEN]262144一道非常有趣的游戏,不,题目.当数据水时,可以这样表示状态.f[i][j]表示合并[i,j]区间所能得到的最大值,有点floyed的小味道.if(f[ ...

  4. 洛谷P3147 262144

    题目 此题数据范围小的话可以用区间\(DP\),但是该题目的数据范围并不能用区间DP来求解,因此我们考虑优化\(DP\). 每个数的生成一定是由这两个区间 考虑区间DP的弊端是并不知道每个数生成的区间 ...

  5. P3146 [USACO16OPEN]248 & P3147 [USACO16OPEN]262144

    注:两道题目题意是一样的,但是数据范围不同,一个为弱化版,另一个为强化版. P3146传送门(弱化版) 思路: 区间动规,设 f [ i ][ j ] 表示在区间 i ~ j 中获得的最大值,与普通区 ...

  6. 一道另类的区间dp题 -- P3147 [USACO16OPEN]262144

    https://www.luogu.org/problemnew/show/P3147 此题与上一题完全一样,唯一不一样的就是数据范围; 上一题是248,而这一题是262144; 普通的区间dp表示状 ...

  7. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 解题报告

    P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...

  8. 洛谷 P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题解

    P3143 [USACO16OPEN]钻石收藏家Diamond Collector 题目描述 Bessie the cow, always a fan of shiny objects, has ta ...

  9. 洛谷P3144 [USACO16OPEN]关闭农场Closing the Farm_Silver

    题目描述 Farmer John and his cows are planning to leave town for a long vacation, and so FJ wants to tem ...

随机推荐

  1. python模块--datetime

    datatime.date类 构造器 返回值类型 说明 (year, month, day) date   类方法/属性     .max date datetime.date(9999, 12, 3 ...

  2. 计算机网络-TCP篇

    TCP篇 之前的总结文章:TCP简单版本介绍-三次握手等 基本认识 TCP 是⾯向连接的(⼀定是「⼀对⼀」才能连接).可靠的.基于字节流的传输层通信协议. RFC 793 是如何定义「连接」的:⽤于保 ...

  3. docker 搭建 zipkin

    1.拉镜像 docker pull openzipkin/zipkin 2.运行镜像 docker run -d --restart always -p 9411:9411 --name zipkin ...

  4. 利用滴答定时器(SysTick)实现简单的延时函数

    预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...

  5. final关键字在PHP中的使用

    final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...

  6. 小程序跳转H5及其他页面

    一.小程序和公众号 答案是:可以相互关联. 在微信公众号里可以添加小程序. 图片有点小,我把文字打出来吧: 可关联已有的小程序或快速创建小程序.已关联的小程序可被使用在自定义菜单和模版消息等场景中. ...

  7. 启动jemeter 报错相关解决方案

    1:当启动jemeter时报错"页面文件太小,无法完成操作" 如图: 是说明分配的内容不足,即可调整内存重启即可解决 1):打开:控制面板>系统和安全>系统 2):点击 ...

  8. 远程连接centos7中mysql8.0

    远程连接centos7中mysql8.0 1.使用Navicat for MySQL或者其它数据连接软件 2.先检查centos中防火墙是否关闭,如果关闭不需要设置,如果没有关闭防火墙,请打开3306 ...

  9. Python创建Excel表格,Word并写入数据

    from tkinter import Tk from time import sleep from tkinter.messagebox import showwarning import win3 ...

  10. Superedge的新特性和未来之路

    作者 王冬,腾讯云高级研发工程师,专注于Kubernetes.容器等云原生领域,SuperEdge 核心开发人员,现负责腾讯云边缘容器TKE Edge私有化相关工作. 背景 2021年9月27号,,在 ...