您的位置:首页 > 其它

最长递增子序列 - dp

2013-09-16 20:32 190 查看
////53、最长递增子序列
////
////题目描述:设L=<a1,a2,…,an>是n 个不同的实数的序列,L 的递增子序列是这样一个子序
////
////列
////
////Lin=<ak1,ak2,…,akm>,其中k1<k2<…<km 且ak1<ak2<…<akm。
////
////求最大的km 值。

#include <iostream>
using namespace std;

//思路:动态规划:dp[i] = max(dp[i], dp[j] + 1); , n > j > i >= 0
#define NSIZ 100

int dp[NSIZ];

void longest_increase_seq(int arr[], int an)
{
int i = 0, j = 0, cn = 0;
int maxlen = 0;

for(i = 0;i <= an; ++i)
{
dp[i] = 1;
}

for(i = an - 1;i >= 0; --i)
{
for(j = i + 1;j < an; ++j)
{
if(arr[i] < arr[j])
{
dp[i] = max(dp[i], dp[j] + 1);

if(maxlen < dp[i])
{
maxlen = dp[i];
}
}
}
}

//打印最长递增子序列
printf("最长递增子序列为:\n");
for(j = maxlen, i =0;i < an; ++i)
{
if(dp[i] == j)
{
printf("%d ", arr[i]);
--j;
}
}
printf("\n");
}

int main()
{
int arr[] = {1, 2, 4, 3, 5};
int an = sizeof(arr)/sizeof(arr[0]);
longest_increase_seq(arr, an);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: