题意:https://www.luogu.com.cn/problem/P1108

如果两个数列组成的数字完全相同,那我们说这两个数列相同。

求出最长下降子序列的方案数。


题解来自 wjyyy大神。

在dp过程中,f数组存的是最长下降子序列的长度,ff数组的下标i是以i结尾的意思,所以最长下降子序列(除了最后一位外)的数据已经丢失,因此不能在方案数相加时再判断是否能加。

我们从头来看,

  1. 如果一个数列的第一个数与另一个数列的第一个数相同,那么现在可以判断它们相等,即可以把其中一个删掉(在代码中的处理是t [ j ] =0)。当不同的数接在它的后面时,又可以将它们判断为两个数列,这是不互相影响的。因为两个数列都可以由这个相等的数列转移而来
  2. 如果一个数列的第一个数与另一个数列的第一个数不同,那么它们不等,且无论后面添加什么,都不相等,即不删去,则按照普通的判断继续做。

由上面的两点,我们已经把重复的删掉,这样可以防止重复计数。

#include <bits/stdc++.h>
using namespace std;
#define max(a,b) (a>b?a:b)
int a[],f[],t[];
//a[i]是题目给的股票价格,f[i]是第i天最长的长度
//t[i]是以i结尾的方案
int main()
{
int n,maxn=;
cin>>n;
for(int i=;i<=n;i++) cin>>a[i],f[i]=;
for(int i=;i<=n;i++)
{
for(int j=;j<i;j++)
{
if(a[i]<a[j])
f[i]=max(f[i],f[j]+);
}//目前是正常求最长下降子序列
maxn=max(maxn,f[i]);//记下最长的长度
for(int j=;j<i;j++)
{
if(f[i]==f[j]&&a[i]==a[j])//一样长而且数列完全一样
t[j]=;
else if(f[i]==f[j]+&&a[i]<a[j])//可以接上前面的
t[i]+=t[j];
}
if(!t[i]) t[i]=;//为了后面的数转移
}
int ans=;
for(int i=;i<=n;i++)
if(f[i]==maxn) ans+=t[i];
cout<<maxn<<" "<<ans;
}

最新文章

  1. C语言 第八章 函数、指针与宏
  2. Spring(4)
  3. linux中模块的构建,传参,和printk函数的简单使用
  4. 《只是为了好玩:Linux之父林纳斯自传》
  5. MSF溢出实战教程
  6. Javascript——Math对象
  7. Mdrill:来自阿里的多维快速查询工具
  8. PHP htmlspecialchars() 函数
  9. React学习笔记(一) 基础知识
  10. Oracle10g、 Oracle11g完美共存
  11. 最近任务 &amp;&amp; react文章列表
  12. 一:配置使用阿里云Maven库
  13. 最大连接数:60 iops:150 什么概念?
  14. Chrome下面查看placeholder的样式
  15. Java项目模板设置
  16. 分布式监控系统开发【day38】:监控数据如何画图(九)
  17. springMVC--annotation
  18. Java中BigDecimal的舍入模式
  19. Java 面试题集锦
  20. spring cloud gateway的stripPrefix配置

热门文章

  1. virtual box设置网络,使用nat网络和仅主机(Host Only)网络进行连接
  2. spring 中 hibernate 的 2种 配置方式(新旧 2种方式)
  3. web.xml中通过contextConfigLocation的读取spring的配置文件
  4. AJ学IOS(53)多线程网络之NSOperation简介
  5. 二进制部署kubernetes集群_kube-apiserver提示&quot;watch chan error: etcdserver: mvcc: required revision has been compacted&#39;
  6. Kubernetes笔记(一):十分钟部署一套K8s环境
  7. c++库 c语言接口
  8. Solidity的Bytecode和Opcode简介
  9. ubuntu(物理机)连接ARM开发板
  10. css之Grid Layout详解