最长上升子序列,又称LIS (Longest Increasing Subsequence)是动态规划的一个经典应用。
在原序列取任意多项,不改变他们在原来数列的先后次序,得到的序列称为原序列的子序列。最长上升子序列,就是给定序列的一个最长的、数值从低到高排列的子序列,最长上升子序列不一定是唯一的。例如,序列2,1,5, 3,6,4,6,3的最长上升子序列为1,3,4,6和2,3,4,6,长度均为4
int a[8] = {2,1,5,3,6,4,6,3};
int dp[8];
int main()
{
int ans = 0;
for(int i = 0; i < 8; i++){
dp[i] = 1;//必须初始化为1, 如果有一项前面没有<它的,那以它为止的最长上升子序列就为1,而不是0
for(int j = i-1; j >= 0; j--){
if(a[j] < a[i])
dp[i] = max(dp[i], dp[j] + 1); //找到i前面最大的dp,并赋值给dp[i]
}
ans = max(dp[i], ans);//找到最长上升子序列长度
}
for(int i = 0; i < 8; i++)
cout << dp[i] << " ";
cout << endl;
cout << ans;
return 0;
}