动态规划(C++)
这道题学到了一个很吊的知识:
Dilworth定理:
最少的下降序列个数就等于整个序列最长上升子序列的长度
下面这个是知识博客链接
#include<iostream>
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
using namespace std;
int cost(int* hight,int num){
int temp;
int last_min = hight[0];
int max_num = INT_MIN;
int* long_list = new int[num];
for (int i = 0; i < num; i++) long_list[i] = 1;
for (int i = 1; i < num; i++) {
temp = 0;
for (int j = 0; j < i; j++) {
if (hight[j] >= hight[i])
{
temp = max(long_list[j],temp);
}
}
long_list[i] = temp + long_list[i];
max_num = max (max_num,long_list[i]);
}
return max_num;
}
//Dilworth定理 最少的下降序列个数就等于整个序列最长上升子序列的长度
int times(int* lists, int num){
int temp;
int last_min = lists[0];
int max_num = INT_MIN;
int* long_list = new int[num];
for (int i = 0; i < num; i++) long_list[i] = 1;
for (int i = 1; i < num; i++) {
temp = 0;
for (int j = 0; j < i; j++) {
if (lists[j] < lists[i])
{
temp = max(long_list[j],temp);
}
}
long_list[i] = temp + long_list[i];
max_num = max (max_num,long_list[i]);
}
return max_num;
}
int main(){
int num;
int* hight;
cin >> num;
hight = new int[num];
for( int i = 0;i < num; i++){
cin >> hight[i];
}
cout << cost(hight,num) << endl;
cout << times(hight,num) <<endl;
}