Luogu P1108 低价购买 DP

第一问求最长下降子序列,不提;

第二问:借鉴了最短路的方法???

我们求出来了每个位置的最长下降子序列的长度,那么刻意这样这样转移

if f[i]==f[j]+1&&a[i]<a[j](i>j) 这代表f[i]可以由f[j]转移过来,所以 f[i]+=f[j]

但是会重复,所以当f[i]==f[j]&&a[i]==a[j]  时,说明没有发生任何转移,去掉一个。

初值 当f[i]==1时,c[i]=1;

#include<iostream>
#include<cstdio>
#include<algorithm>
#define max(a,b) a>b?a:b
#define R register int
using namespace std;
const int N=5010;
int n;
int a[N],f[N],c[N];
inline int g() {
    R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch==‘-‘?-1:fix;
    do ret=(ret<<3)+(ret<<1)+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
signed main() {
    n=g();for(R i=1;i<=n;i++) a[i]=g();
    long long ans1=0,ans2=0;
    for(R i=1;i<=n;i++) {
        f[i]=1;
        for(R j=1;j<i;j++) if(a[i]<a[j]) f[i]=max(f[i],f[j]+1);
        ans1=max(ans1,f[i]);
    }
    for(R i=1;i<=n;i++) {
        if(f[i]==1) c[i]=1;
        for(R j=1;j<i;j++)
            if(f[i]==f[j]+1&&a[i]<a[j]) c[i]+=c[j];
            else if(f[i]==f[j]&&a[i]==a[j]) c[i]=0;
        if(f[i]==ans1) ans2+=c[i];
    }
    printf("%lld %lld\n",ans1,ans2);
}


2019.04.28

原文地址:https://www.cnblogs.com/Jackpei/p/10783140.html

时间: 2024-08-29 17:30:41

Luogu P1108 低价购买 DP的相关文章

luogu P1108 低价购买

题目链接 luogu P1108 低价购买 题解 朴素n^2dp,对于方案的转移利用加法原理,dp每一种最有解的方案 代码 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; const int maxn = 60007; int f[maxn],c[maxn],a[maxn]; int cnt=0; int n; int m

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

题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低价购买”的原则.写一个程序计算最大购买次数. 这里是某支股票的价格清单: 日期 1 2

P1108 低价购买 dp

题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^{16}216范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低价购买”的原则.写一个程序计算最大购买次数. 这里是某支股票的价格清单: 日

入门动态规划 洛谷P1108 低价购买

P1108 低价购买 题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循"低价购买:再低价购买"的原则

低价购买 dp

题目描述 "低价购买"这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:"低价购买:再低价购买".每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2162^{16}216范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循"低价购买:再低价购买"的原则.写一

P1108 低价购买

题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低价购买”的原则.写一个程序计算最大购买次数. 这里是某支股票的价格清单: 日期 1 2

LuoGu 1108 低价购买 LIS方案数

一句话题意:两个序列的LIS的长度和方案数 首先这里n方的应该是要比nlog的好的,因为还涉及到一个求方案 主要考虑下第二问, 不同的方案数应该怎么求 实际上 对于一个长为len的子序列, 它的方案数即为所有长为len-1的,且可以转移到它的子序列 (都是满足题意的)的方案数之和 这样就比较好办了,直接在原本的求LIS的转移里搞搞就行了. 那么答案就是所有长度为LIS的方案数之和了. 但是还有一个问题,这样的话根本没考虑方案是否重复. 那么怎么样把相同的去掉呢?? 我们把长度相等,当前对应位上的

题解 P1108 【低价购买】

题目链接 Solution 低价购买 题目大意:求一个数列的最长下降子序列长度,以及长度最长的下降子序列的数量 题目分析:求最长下降子序列是常规操作了,可以直接用朴素\(O(n ^ 2)\)算法,也可以用二分做到\(O(nlogn)\)复杂度,不过\(n \leq 5000\)朴素算法随便跑 那么如何统计方案呢? 我们\(dp\)求最长下降子序列是设\(d(i)\)表示以\(i\)结尾的下降子序列的最长长度.同理,我们可以用\(f(i)\)表示以\(i\)结尾,长度为\(d(i)\)的下降子序列

低价购买-最长下降子序列和方案计数

http://www.luogu.org/problem/show?pid=1108 题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它.买的次数越多越好!你的目标是在遵循以上建议的前提下,求你最多能购买股票的次数.你将被给出一段时间内一支股票每天的出售价(2^16范围内的正整数),你可以选择在哪些天购买这支股票.每次购买都必须遵循“低价购买:再低