在翻dp水题的时候找到的有趣的题0v0

原文>>https://www.luogu.org/problem/show?pid=2362<<

题目描述

某农场有一个由按编号排列的n根木桩构成的首尾不相连的围栏。现要在这个围栏中选取一些木桩,按照原有的编号次序排列之后,这些木桩高度成一个升序序列。所谓的升序序列就是序列中的任何一个数都不小于它之前的任何一个数。试编写程序从这个围栏中选取合适的木桩使得选出的木桩个数t最大,并求出选取出t根木桩的方案总数c。

输入输出格式

输入格式:

文件中的第一行只有一个数m,表明随后有m个问题的描述信息。每个问题的描述信息格式为n h1,h2,h3,…,hn(其中hi(i=1,2,3,…,n)表示第i根木桩的高度。)


输出格式:

依次输出每个问题中t和c的解。每行输出一个问题的解。

这题和一般最长不下降子序列的区别就在于他需要输出最大解的种类个数.怎么统计这些可能解就是这题有意思的地方.

我们通过a数组存序列,b来记录前i个数的最长子序列,最关键的是c,c[i]的意义是记录在1~i-1中满足最大序列为b[i]-1的子序列个数.

挺难理解,我举个例子:

给8个数字 17534851 当i=3时 b[3]=2 (15或17) c[3]则表示当i=1~2中满足b[i]=1的情况 显然只有i=1时(i=2时b[2]=2) 所以c[3]=1;

i=4时 b[4]=2 c[4]=1;i=5时 b[5]=3 (134) c[5]=3 (i=2,3,4时c[i]为2).

于是乎,i=n时最长序列就在b里找,假设找到最大值bmax,而可能的情况则为 for(i=1;i<=n;i++) if(b[i]=bmax) ans+=c[i];

为什么会有这样的关系?我们在开始时先给 b c 数组赋初值1(序列最短可为自己本身),之后的讨论都是建立在a[i]>=a[r]上的.所以要在第一个循环前加上判断条件if(a[i]>=a[r]) (r的出处请脑补最长不下降子序列模板),bmax对应的c[i]意为不包括a[i]在内的最大序列为bmax-1的情况.所以如果在尾部加上a[i],最长数目就变成了bmax.这就是该算法的原理.觉得理解不充分的话可以自己举一个例子套套看,与代码结合也许会有助于理解.

#include<iostream>
using namespace std;
int main()
{
int k,n,b[],c[],a[],i,j;
cin>>k;
while(k--)
{
cin>>n;
for(i=;i<=n;i++)
{
cin>>a[i];
b[i]=c[i]=;
}
for(j=;j<=n;j++)
{
int r;
for(r=j-;r>=;r--)
{
if(a[j]>=a[r])
{
if(b[j]<b[r]+)
{
b[j]=b[r]+;
c[j]=c[r];
}
else if(b[j]==b[r]+)
{
c[j]+=;
}
}
} }
int max=-,bj=;
for(i=;i<=n;i++)
{
if(b[i]>max)
{
max=b[i];
bj=i;
}
}
int ans=;
for(i=;i<=n;i++)
{
if(b[i]==b[bj]) ans+=c[i];
}
cout<<b[bj]<<" "<<ans<<endl;
}
}
 

洛谷P2362 围栏木桩----dp思路的更多相关文章

  1. 洛谷 P2362 围栏木桩

    题目描述 某农场有一个由按编号排列的n根木桩构成的首尾不相连的围栏.现要在这个围栏中选取一些木桩,按照原有的编号次序排列之后,这些木桩高度成一个升序序列.所谓的升序序列就是序列中的任何一个数都不小于它 ...

  2. 洛谷P1244 青蛙过河 DP/思路

    又是一道奇奇怪怪的DP(其实是思路题). 原文戳>>https://www.luogu.org/problem/show?pid=1244<< 这题的意思给的挺模糊,需要一定的 ...

  3. AC日记——围栏木桩 洛谷 P2362

    围栏木桩 思路: DP: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 2001 int n,m,ai[ma ...

  4. 洛谷 P3049 Landscaping ( 贪心 || DP)

    题意 : 有n块土地,每块有A[i]泥土,现把其改造成B[i]泥土,有3种操作:(1)花费X向任意土地增加1泥土:(2)花费Y向任意土地减少1泥土:(3)花费Z*|i-j|把土地i的1泥土运到土地j. ...

  5. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  6. NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/9261079.html 题目传送门 - 洛谷P3959 题目传送门 - Vijos P2032 题意 给定一个 ...

  7. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  8. 洛谷P1140 相似基因 (DP)

    洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...

  9. 洛谷P2224 [HNOI2001] 产品加工 [DP补完计划,背包]

    题目传送门 产品加工 题目描述 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时 ...

随机推荐

  1. 数据集成工具Kettle、Sqoop、DataX的比较

    数据集成工具很多,下面是几个使用比较多的开源工具. 1.阿里开源软件:DataX         DataX 是一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL.Oracle等).H ...

  2. TensorFire:WEB端的高性能神经网络框架

    TensorFire:WEB端的高性能神经网络框架 摘要: 近日,一种专门用于在网页内执行神经网络算法的JavaScript库——TensorFire引起了人们的关注,这种JavaScript库在浏览 ...

  3. 移植并修改成功的模拟iic读写EEPROM at24c02

    2010-04-24 12:58:00 注:如果要读24c128或264,地址位为16位的.现在的地址位为8位. protues仿真图 源程序如下: #include <iom16v.h> ...

  4. CRM 权限设置 ss

    表结构的设计 权限表 url -url地址的正则表达式 ^$ title - 标题 角色表 name - 角色名称 permissions 多对多关联权限表 (权限和角色的关系表) 用户表 name ...

  5. Python爬虫_Selenium与PhantomJS

    Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动化操作,不同是Selenium可以直接运 ...

  6. Django框架----路由系统、视图和模板(简单介绍)

    一.路由配置系统(urls) URL配置(URLconf)就像Django所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表: 你就是以这种方式告诉Django,对于这个URL ...

  7. css 初级进阶

    摘自:https://www.jianshu.com/p/dcc40ccc9841 CSS中级 Class和ID选择器 CSS初级教程中我们可以使用HTML标签选择器定义样式. 同样你也可以使用Cla ...

  8. Python爬虫【一】爬虫的基本原理

    一.爬虫基本原理 1.获取网络数据 用户方式:浏览器提交请求->下载网页代码->解析/渲染成页面 爬虫方式:模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放 ...

  9. python的一些遗漏用法

    一. 补充基础数据类型的相关知识点 1. str. join() 把列表变成字符串 li = ["李嘉诚", "麻花藤", "⻩海峰", & ...

  10. How many zero's and how many digits ? UVA - 10061

    Given a decimal integer number you will have to find out how many trailing zeros will be there in it ...