poj 1952 最长不下降子序列加最长串数
2010-04-14 21:32
405 查看
#include <iostream> #include <limits.h> using namespace std; #define inf INT_MAX; int data[5003]; int dp[5003]; int count[5003]; int minNow=0; void lds(int n){ memset(dp,0,sizeof(dp)); minNow=0; memset(count,0,sizeof(count)); count[0]=1; int t; for(int i=1;i<=n;i++) { dp[i]=1; t=-1; for(int j=i-1;j>=0;j--) { if(data[i] < data[j]) { if(dp[j]+1==dp[i]&&data[j]!=t)//dp保证前面的子序列是有序的,如果有相同的,由t排除,如果不同的,两个的dp值肯定不同 {//所以不会出现count加了不应该加的东西,exp:6 7 6 7 6 4 count[i]+=count[j]; t=data[j];//同理,不可能出现data【j】之前相同的元素,所以直接可以赋值给下一个 } else if(dp[j]+1>dp[i]) { dp[i]=dp[j]+1; count[i]=count[j]; t=data[j]; } } } } int out=0; for(int i=0;i<n;i++) out=max(out,dp[i]); cout<<out<<" "; cout<<count <<endl; }; int main() { int n; cin>>n; { for(int i=1;i<=n;i++) scanf("%d",&data[i]); data[0]=1<<30; lds(n+1); } }
相关文章推荐
- 【最长下降子序列的长度和个数】 poj 1952
- POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
- 【最长下降子序列】北大 poj 1952 BUY LOW, BUY LOWER
- POJ-1952 最长下降子序列 + 方案数
- POJ 1952 BUY LOW, BUY LOWER DP 最长下降序列求个数
- POJ - 1952 BUY LOW, BUY LOWER(最长下降子序列,计数)
- POJ1952(最长下降子序列+去重)
- poj 1952 BUY LOW, BUY LOWER[最长单调子序列变形]
- poj 1952 最长递减子序列个数
- poj_1952最大下降子序列,统计个数
- POJ 1952-最长下降子序列+去重
- poj 1609 Tiling Up Blocks(最长不下降序列)
- poj_1952最大下降子序列,统计个数
- 【最长下降子序列】北大 POJ 1065 Wooden Sticks
- POJ 1836 Alignment 最长上升(下降)子序列(dp)
- poj 1836 Alignment( 最长上升(下降)子序列 )
- POJ 1952 BUY LOW,BUY LOWER 最长递减子序列 动态规划
- (复习)poj 1952 最长下降子序列—— dp+方案个数
- POJ 1952 BUY LOW, BUY LOWER(最长递减序列,去重, 动态规划)
- poj 1952 BUY LOW, BUY LOWER(求最长下降子序列个数)