标签:des style blog http io color ar os sp
Description
"Buy low; buy lower"
Day 1 2 3 4 5 6 7 8 9 10 11 12 Price 68 69 54 64 68 64 70 67 78 62 98 87
Day 2 5 6 10 Price 69 68 64 62
Input
Output
Sample Input
12 68 69 54 64 68 64 70 67 78 62 98 87
Sample Output
4 2
Source
求递减子序列的题目,不过本题多了一个要求,需要统计这样的最长递减子序列的个数,并且需要去掉重复的子序列。
思路就是需要统计当前下标为结束的时候的最长子序列,然后求这个子序列的数,还需要和前面一样的子序列去重。
详细注释的代码:
#include <stdio.h> #include <vector> #include <string.h> #include <algorithm> #include <iostream> #include <string> #include <limits.h> #include <stack> #include <queue> #include <set> #include <map> using namespace std; const int MAX_N = 5001; int arr[MAX_N];//数据记录 int C[MAX_N];//C[i],下标为i的时候最长子序列有多少个 int MaxLen[MAX_N];//MaxLen[i],下标为i的时候,最长子序列多长 void getLenAndNum(int &len, int &c, int n) { memset(C, 0, sizeof(int) * n); C[0] = MaxLen[0] = 1; for (int i = 1; i < n; i++) { MaxLen[i] = 1;//初始值为只有一个 for (int j = 0; j < i; j++) { if (arr[j] > arr[i] && MaxLen[i] < MaxLen[j] + 1) MaxLen[i] = MaxLen[j] + 1; }//求以当前i下标结束的时候,最长子序列长度 for (int j = 0; j < i; j++) { if (arr[j] > arr[i] && MaxLen[i] == MaxLen[j] + 1) C[i] += C[j]; }//求有多少最长子序列 if (!C[i]) C[i] = 1;//注意是递增数列的时候 for (int j = 0; j < i; j++) { if (arr[j] == arr[i] && MaxLen[i] == MaxLen[j]) C[i] -= C[j]; }//去掉重复计算,方便后面的统计 } len = 0; for (int i = 0; i < n; i++) { if (len < MaxLen[i]) len = MaxLen[i]; }//找出最长子序列 c = 0; for (int i = 0; i < n; i++) { if (len == MaxLen[i]) c += C[i]; }//找出最长子序列数 } int main() { int N; while (~scanf("%d", &N)) { for (int i = 0; i < N; i++) { scanf("%d", arr+i); } int len, c; getLenAndNum(len, c, N); printf("%d %d\n", len, c); } return 0; }
POJ 1952 BUY LOW, BUY LOWER 动态规划题解
标签:des style blog http io color ar os sp
原文地址:http://blog.csdn.net/kenden23/article/details/41047779