规定长度的上升子序列的个数
来源:互联网 发布:打码平台网站源码 编辑:程序博客网 时间:2024/05/04 08:36
给定一个长度为n的序列(n <= 100) ,给定m(m <= n),求该序列中有多少值不相同的长度为m的严格上升子序列。
原始数据储存在数组a[]里面,用dp[i][j]表示以i为结尾的长度为j的上升子序列的个数,在满足a[k]<a[i]的情况下,dp[i][j] += dp[k][j-1],需要注意的是中间要取模。
因为要求值不同,所以a:1 2 2 4 时,a[1] a[2] a[4]与a[1] a[3] a[4]是相同情况(设下标从1开始),所以用一个 vis[] 数组标记这个数是否用过。
#include<iostream>#include<cstring>#define maxn 105#define mod 1000000007using namespace std;int dp[maxn][maxn];int num[maxn];int vis[maxn];int main(){ int T; cin>>T; while(T>0) { T--; int n, m; cin>>n>>m; memset(dp,0,sizeof(dp)); memset(vis,0,sizeof(vis)); for(int i=1; i<=n; i++) { cin>>num[i]; dp[i][1]=1; } for(int i=2; i<=n; i++) { for(int j=1; j<=n; j++) { for(int k=i-1; k>=1; k--) { if(num[i]>num[k]&&!vis[num[k]]) { vis[num[k]]=1; dp[i][j]+=dp[k][j-1]; dp[i][j]%=mod; } memset(vis,0,sizeof(vis)); } } } memset(vis,0,sizeof(vis)); int ans=0; for(int i=n; i>=1; i--) { if(vis[num[i]]) continue; vis[num[i]] = 1; ans += dp[i][m]; ans %= mod; } cout<<ans<<endl; } return 0;}
0 0
- 规定长度的上升子序列的个数
- 规定长度的上升子序列的个数
- 拦截导弹(规律:下降子序列的个数等于最长上升子序列的长度)
- 下降子序列的个数等于最长上升子序列的长度
- 拦截导弹(规律:下降子序列的个数等于最长上升子序列的长度)
- 求最长上升子序列的长度
- 求最长上升子序列的长度
- 最长上升子序列的长度
- 最长上升子序列长度及其个数
- 最长上升子序列的个数
- hdu 4352 数位dp(最长上升子序列的长度为k的个数)
- HDU 5569 长度为n的上升子序列个数d (大数模板+DP)
- rqnoj-217-拦截导弹-最长不上升子序列以及不上升子序列的个数
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)长度的O(nlogn)算法 .
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)长度的O(nlogn)算法
- 最长上升子序列(LIS)长度的O(nlogn)算法
- NYOJ71 独木舟上的旅行
- java计算参数目录大小的递归和迭代实现
- 关于iOS启动图片和AppIcon
- 富文本技术
- iOS maskView使用
- 规定长度的上升子序列的个数
- Activity的启动模式
- ASCII码对照表
- 137. Single Number II
- css3+js+html实现模拟时钟
- 最新版FusionCharts3D饼图
- 第一次打字测试成绩
- 延时去闪大致流程
- OPTICS算法的C语言实现