首页 > 其他分享 >P1108 低价购买 题解

P1108 低价购买 题解

时间:2024-09-19 22:14:27浏览次数:1  
标签:方案 5005 int 题解 P1108 我们 dp 低价

这题在求最长下降子序列的基础上加了一个求方案数的要求,这就让这道题目变难了很多。
我们考虑我们在求最长下降子序列的时候,总是从这一位,要么重新开始计数,要么只和前面的有关,所以前面的信息完全丢失了,无法判断有多少方案,所以我们就要针对前面的方案数设计一个dp来统计。
可以称之为dp套dp?
其实我们不难想到,对于方案数也具有最优子结构,也无后效性,可以转移。
我们很自然地想到对于每一个可能的转移点,如果这个转移点是当前最优的,那么我们就要将方案数改成它;如果相等,则累加。
但是这样会有问题,即当相等时会让后面的点向前扫的时候重复计数,所以我们直接选择将其中一个的方案数变为0。

这道题就启示我们不要被一些看起来不是很好想的唬到了,其实还是很好想的。

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[5005],dp[5005],f[5005];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	for(int i=1;i<=n;++i){
		for(int j=1;j<i;++j){
			if(a[i]<a[j]) dp[i]=max(dp[i],dp[j]+1);
		}
		if(!dp[i]) ++dp[i];
		for(int j=1;j<i;++j){
			if(dp[i]==dp[j]&&a[i]==a[j]) f[j]=0;
			if(dp[i]==dp[j]+1&&a[i]<a[j]) f[i]+=f[j];
		}
		if(!f[i]) f[i]=1;
	}
	long long maxi=0,num=0;
	for(int i=1;i<=n;++i) maxi=max(maxi,dp[i]);
	for(int j=1;j<=n;++j){
		if(dp[j]==maxi) num+=f[j];
	}
	printf("%lld %lld",maxi,num);
	return 0;
}

标签:方案,5005,int,题解,P1108,我们,dp,低价
From: https://www.cnblogs.com/mountzhu/p/18421477

相关文章

  • 题解:CF1906F Maximize The Value
    可以在cnblog中阅读。见这种题比较少,写篇题解加深印象。如果直接上数据结构维护数组,似乎没有好的办法处理操作序列的一个子段。那不妨转变思路,对操作序列上数据结构维护。假设顺序进行每个修改操作,我们用时间表示修改操作的编号,位置表示数组的下标,则常见的维护序列的数据结构......
  • 蓝桥杯十五届软件赛C++B组题解
    最近蓝桥杯官网已经把十五届题目上架了,我会尽快的将题解发出来,没有发的过段时间再补。​​​​​​​数字接龙一个很鹅心的搜索题,一不注意就会写错,比赛的时候写不来,题目上架后也WA了两个样例才过。题目大意:也就是说从(1,1)开始 ,下一步路的数据总是要比当前数据大1,超过k就......
  • P2051 [AHOI2009] 中国象棋 题解
    DP好题?首先确定,每一行/列只能放至多两个棋子,这么少,所以我们的状态肯定和棋子数有关。由于我们不关注具体的方案数,所以我们不妨只关心对应棋子数量的行/列的数量。同时,由于考虑行和列都是一样的,所以我们不妨用行递推。所以我们设$\dp_{i,j,k}\$表示当前放到第\(i\)行,有\(......
  • Capital许可使用常见问题解答
    在使用Capital软件的过程中,许多用户可能会遇到关于许可使用的各种问题。为了帮助大家更好地理解和合规使用Capital软件,我们整理了一份常见问题解答,希望能为您提供有价值的参考。一、Capital许可证的类型有哪些?Capital提供多种许可证类型,包括永久许可证、订阅许可证等。永久许可......
  • 【题解】Solution Set - NOIP2024集训Day32 数位 dp
    【题解】SolutionSet-NOIP2024集训Day32数位dphttps://www.becoder.com.cn/contest/5537order:1,3,5,6,2,4「SDOI2013」淘金就是要算前\(k\)大的和。考虑一个位置\((i,j)\)在变化完了之后的金子个数。(也即逆变换。设:\(f^\prime(x)\)表示在\(1\simN\)范围内,数位......
  • 【洛谷 P5730】【深基5.例10】显示屏 题解(数组+循环)
    【深基5.例10】显示屏题目描述液晶屏上,每个阿拉伯数字都是可以显示成的点阵的(其中X表示亮点,.表示暗点)。现在给出数字位数(不超过)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。输入格式第一行输入一个正整数,表示数......
  • luogu-P10596题解
    简要题意一个有\(N\)个元素的集合有\(2N\)个不同子集(包含空集),现在要在这\(2N\)个集合中取出若干集合(至少一个),使得它们的交集的元素个数为\(K\),求取法的方案数,答案模\(10^9+7\)。数据范围:\(1\leK\leN\le10^6\)。题解我们设\(f(i)\)表示选出子集大小恰好为\(i\)的......
  • 【洛谷】P11062 【MX-X4-T2】「Jason-1」加法 的题解
    【洛谷】P11062【MX-X4-T2】「Jason-1」加法的题解题目传送门离CSP初赛只剩两天了,祝各位OIersrp++!!!题解挺有意思的一道思维题,不过比赛的时候没想出来。需要分类讨论两种情况:当a......
  • ICPC2021 沈阳站 M String Problem 题解 | 十种做法一网打尽 , 一道题带你回顾字符串科
    题目传送门题意给定一个字符串,求每个前缀的字典最大序子串。注意到:对于每个前缀$s_{[1,i]}$,字典序最大子串的右边界一定是\(i\)。随着着\(i\)的增大,字典序最大子串的左边界一定是单调不减的。解法不分先后。后缀数组SASA&SAM后缀数组&后缀自动机SA对所有......
  • 和之大题解
    1111...=2^n-1长度为n的都是1的二进制数=2的n次方-1思路:对于每个数只有选或不选(1或0)的二进制,剩余见代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;longlongf[20];intmain(){ freopen("202409C.in","r",stdin); freopen("202409C.out......