洛谷 1108 低价购买
2016-03-19 10:49
274 查看
http://www.luogu.org/problem/show?pid=1108#
第一问就是裸的最长下降子序列
第二问比较难,看了题解想了好久才明白,可以加一个t[i]数组表示1到i取最长下降子序列的方案数,显然如果f[i]==1则t[i]=1,然后j从1到i-1循环,f[i]==f[j]+1&&a[i]< a[j]时说明可以从1到j的最长子序列后加一个a[i]即加上t[j]个方案数,这里要去除“看起来一样”的方案,当f[i]==f[j]&&a[i]==a[j]时,f[j]即重复的,直接t[j]=0。
第一问就是裸的最长下降子序列
第二问比较难,看了题解想了好久才明白,可以加一个t[i]数组表示1到i取最长下降子序列的方案数,显然如果f[i]==1则t[i]=1,然后j从1到i-1循环,f[i]==f[j]+1&&a[i]< a[j]时说明可以从1到j的最长子序列后加一个a[i]即加上t[j]个方案数,这里要去除“看起来一样”的方案,当f[i]==f[j]&&a[i]==a[j]时,f[j]即重复的,直接t[j]=0。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int f[5010],a[5010],t[5010]; int n,ans1,ans2; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); f[i]=1; } for(int i=1;i<=n;i++) { for(int j=1;j<=i-1;j++) { if(a[i]<a[j]) f[i]=max(f[i],f[j]+1); } if(f[i]==1) t[i]=1; for(int j=1;j<=i-1;j++) { if(f[i]==f[j]+1&&a[i]<a[j]) t[i]+=t[j]; if(f[i]==f[j]&&a[i]==a[j]) t[j]=0; } } for(int i=1;i<=n;i++) ans1=max(f[i],ans1); for(int i=1;i<=n;i++) if(f[i]==ans1) ans2+=t[i]; printf("%d %d",ans1,ans2); return 0; }
相关文章推荐
- 商城公告功能开发总结
- 有些加密视频关闭svn所需要的操作
- 线程取消点的困惑
- JS事件模型
- 工作记录之开发HRM项目总结
- 背景图片自适应分辨率浏览器大小自动拉伸全屏代码
- 友元简介:友元函数,友元类和友元成员函数
- 自定义创建View
- cocos2d-x 源码分析 总目录
- 22.文件解压缩
- hadoop0.20.2 eclipse插件安装指南
- Swift_可选类型(Optionals)
- aspx
- HDU 4990 Reading comprehension(构造矩阵)
- UI第十四天
- CentOS系统上安装配置Oracle数据库的详细教程
- 析构函数为什么设置为虚函数
- tcp、udp协议栈
- php 格式
- 钱币兑换问题---hdu1284(完全背包)