POJ-1952 最长下降子序列 + 方案数
2013-10-10 18:58
453 查看
求最长下降子序列 简单 就是求方案数比较麻烦点 看了别人的解题报考才懂
也对最长**子序列的理解更深一步
也对最长**子序列的理解更深一步
#include<stdio.h> #include<string.h> #include<queue> using namespace std; const int maxn = 5005; int n; int price[maxn],len[maxn],count[maxn]; //len[i]记录到i最长下降序列数 count记录方案数 int maxnum,max_count; int main() { //freopen("data.in","r",stdin); while( scanf("%d",&n) != EOF ) { for( int i=0; i < n; i ++ ) scanf("%d",&price[i] ); maxnum = -1; for( int i = 0; i < n; i++ ) { count[i] = 1; len[i] = 1; //初始化 for( int j=i-1; j>=0; j-- ) //找出第i项与i-1项匹配出最长的下降序列 { if( price[j] > price[i] ) { if( len[j] + 1 > len[i] ) { len[i] = len[j]+1; count[i] = count[j]; } else if( ( len[j] + 1 ) == len[i] ) //下降序列数相同 方案数相加 count[i] += count[j]; } else if( price[j] == price[i]) //去重 { if( len[i] == 1 ) count[i]=0; break; } } if( len[i] > maxnum ) //找出最长下降序列数 maxnum = len[i]; } max_count = 0; for( int i=0; i < n; i ++ ) //统计方案数 { if( len[i] == maxnum ) max_count += count[i]; } printf("%d %d\n",maxnum,max_count); } return 0; }
相关文章推荐
- POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
- poj 1952 BUY LOW, BUY LOWER 最长下降子序列+统计不重复方案数
- (复习)poj 1952 最长下降子序列—— dp+方案个数
- 【最长下降子序列的长度和个数】 poj 1952
- poj 1952 最长不下降子序列加最长串数
- POJ - 1952 BUY LOW, BUY LOWER(最长下降子序列,计数)
- POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
- 【最长下降子序列】北大 poj 1952 BUY LOW, BUY LOWER
- poj 1952 BUY LOW, BUY LOWER(求最长下降子序列个数)
- 洛谷Oj-低价购买-最长下降子序列 +最佳方案数统计
- poj 1952 最长递减子序列个数
- poj 1952 BUY LOW, BUY LOWER[最长单调子序列变形]
- 最长不下降子序列 输出方案数
- POJ 1952-最长下降子序列+去重
- POJ 1952 BUY LOW,BUY LOWER 最长递减子序列 动态规划
- POJ 1952(最长不下降子序列的个数)
- POJ 1952 BUY LOW BUY LOWER 【DP】最长降序子序列及其计数问题
- POJ 1836 Alignment 最长上升(下降)子序列(dp)
- poj_1952最大下降子序列,统计个数
- poj 1609 Tiling Up Blocks(最长不下降序列)