poj 1952 BUY LOW, BUY LOWER
2012-09-02 21:53
369 查看
dp: 求一串序列中最长递减子序列包含的数的个数以及有几个长度相同的最长的递减子序列,并不要求连续。 #include <iostream> #include <string.h> #include <cstdio> using namespace std; const int size = 5100; int maxlen[size]; int maxnum[size]; int main() { int a[size]; int n; while (scanf("%d", &n) != EOF){ for (int i = 1; i <= n; i ++){ scanf("%d", &a[i]); maxnum[i] = 0; maxlen[i] = 1; } for (int i = 1 ; i <= n; i ++){ for (int j = 1; j < i; j ++){ if (a[i] < a[j]){ maxlen[i] = max(maxlen[i], maxlen[j]+1);//我们只要比较每一个a[i]和它前面的a[j](j<i),如果a[i]>a[j],则到i为止的的最长序列至少比到j多1. } } } for (int i = 1; i <= n; i ++) if (maxlen[i] == 1)maxnum[i] = 1; for (int i = 1; i <= n; i ++){ for (int j = i-1; j > 0; j --){ if (a[j] > a[i]){ if (maxlen[j]+1 == maxlen[i]){ maxnum[i] += maxnum[j]; } } if (a[j] == a[i]){ if (maxlen[i] == 1)maxnum[i] = 0; break; } } } int maxx = -1; for (int i = 1; i <= n; i ++){ if (maxlen[i] > maxx) maxx = maxlen[i]; } int ans = 0; for (int i = 1; i <= n; i ++){ if (maxlen[i] == maxx) ans += maxnum[i] ; } printf("%d %d\n", maxx, ans); } return 0; }
相关文章推荐
- POJ 1952 buy low,buy lower
- POJ 1952 BUY LOW, BUY LOWER
- POJ 1952 BUY LOW, BUY LOWER
- poj 1952 BUY LOW, BUY LOWER
- POJ1952 BUY LOW, BUY LOWER
- POJ 1952 BUY LOW, BUY LOWER(DP)
- POJ 1952 BUY LOW, BUY LOWER 动态规划题解
- poj1952 BUY LOW, BUY LOWER
- POJ 1952 BUY LOW, BUY LOWER(最长递减序列,去重, 动态规划)
- poj 1952 BUY LOW, BUY LOWER(求最长下降子序列个数)
- POJ 1952 BUY LOW, BUY LOWER 动态规划题解
- poj 1952 BUY LOW, BUY LOWER【解法一】
- POJ 1952 BUY LOW, BUY LOWER 笔记
- poj1952 BUY LOW, BUY LOWER(最长递减子序列及个数)
- POJ 1952 BUY LOW, BUY LOWER
- POJ 1952 BUY LOW, BUY LOWER
- POJ 1952 BUY LOW, BUY LOWER
- POJ 1952 BUY LOW, BUY LOWER
- poj 1952 BUY LOW, BUY LOWER 最长下降子序列计数
- POJ-1952 BUY LOW, BUY LOWER(线性DP)