规定长度的上升子序列的个数
2016-05-01 13:27
495 查看
给定一个长度为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[] 数组标记这个数是否用过。
原始数据储存在数组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 1000000007 using 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, x; cin>>n>>m; int last = -1; int tot = 0; 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; }
相关文章推荐
- 实现带有验证码的ajax局部刷新登录界面
- 第九周学习进度
- leetcode-111. Minimum Depth of Binary Tree
- cocos2d-x pageView左右循环滑动
- 修改CentOS的IP地址
- 【链式栈】链式栈的封装<源代码>
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- HDOJ5672
- 关于springmvc的流程
- 第 28 章 CSS3 多列布局
- uva 612 DNA Sorting
- 第十一周项目3.2 警察和厨师 为Polic类和Cook类增加了对象成员,请扩充代码
- Ubuntu14.04 jsoncpp搭建
- __attribute__ ((packed))
- HDUOJ Highways (最小生成树)
- SICP 换零钱的迭代版本
- HDUOJ1864最大报销额(01背包)
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
- html中音频和视频
- Android M 6.0 Build about 64-bit (__arm64__)