在翻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. 大数据和hadoop的一些基础知识

    一.前言 大数据这个概念不用我提大家也听过很多了,前几年各种公开论坛.会议等场合言必及大数据,说出来显得很时髦似的.有意思的是最近拥有这个待遇的名词是“人工智能/AI”,当然这是后话. 众所周知,大数 ...

  2. 数据迁移工具Sqoop和DataX功能比较

    本文转载自: http://www.cnblogs.com/panfeng412/archive/2013/04/29/data-migration-tool-sqoop-and-datax.html ...

  3. flask 重定向到上一个页面,referrer、next参数

    重定向会上一个页面 在某些场景下,我们需要在用户访问某个url后重定向会上一个页面,比如用户点击某个需要登录才能访问的连接,这时程序会重定向到登录页面,当用户登录后比较合理的行为是重定向到用户登录前浏 ...

  4. flask框架----flask中的wtforms使用

    一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtfo ...

  5. JavaScript快速总结之一

    js格式和位置: <!--js内容可以在head中,也可以在body中,不同位置执行顺序会有区别 ,另外也可以单独放到一个js文件中,这样方便维护和修改,而且,可以加快html页面的加载速度.- ...

  6. 获取其他线程的数据用 queue, 多进程Q

    获取其他线程的数据用 queue, 多进程Q

  7. 用switch语句根据消费金额计算折扣

    最终输出效果: 代码: package com.mingrisoft; import java.util.Scanner; public class ProductPrice { public sta ...

  8. Windows系统中设置Python程序定时运行方法

    Windows系统中设置Python程序定时运行方法 一.环境 win7 + Python3.6 二.步骤 1,在Windows开始菜单中搜索“计划任务”,并且点击打开“计划任务”: 2.点击“创建基 ...

  9. 模拟实现ATM+购物商城程序

    流程图: 需求: ATM:模拟实现一个ATM + 购物商城程序额度 15000或自定义实现购物商城,买东西加入 购物车,调用信用卡接口结账可以提现,手续费5%支持多账户登录支持账户间转账记录每月日常消 ...

  10. linux下安装与部署redis

    一.Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多 ...