用动态规划求解的一个例题
2008-03-20 21:28
253 查看
问题描述:输入规模n和由n个元素组成的序列A1...An,求序列中的最长单调递增子序列的长度。
解题思路:这是一个求最优解的题目,可以采用动态规划的方法。首先,找出原始问题的最优子结构。
假设序列A1...Ai-1(i<n)是输入序列的一个子序列,其中存在一个元素Ak(k<=i-1)为A0...Ai-1中最长子序列的最后一个元素,此时对于子序列A1...Ai分两种情况,如果Ai>Ak,则A1...Ai中最长递增子序列长度为A1...Ai-1中最长子序列长度加1,否则和A1...Ai-1中最长递增子序列长度相同。如此可以得到一个递归式:设数组L1...Ln存诸子序列A1...A1,A1...A2,A1...A3,A1...An中最长递增子序列的长度,则可以得到一个递归式:
[1 i=1;
L[i]=[MAX(L[1]...L[i-1]) 1<i<=n,Ai<=Ak
[MAX(L[1]...L[i-1])+1 1<i<=n,Ai>Ak
根据上式构造最优结构即最长公共子序列,代码如下:
#include <stdio.h>
#define MAXSIZE 10000
int LstSub(int A[],int n)
{
int L[MAXSIZE],i,j,k,max;
L[0]=1;
for(i=1;i<n;i++)
{
max=0X80000000;
for(j=0;j<i;j++)
{
if(L[j]>max)
{ max=L[j]; k=j; }
}
if(A[i]>A[k])
L[i]=max+1;
else
L[i]=max;
}
return L[n-1];
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int A[MAXSIZE],i,lst;
for(i=0;i<n;i++)
scanf("%d",A+i);
lst=LstSub(A,n);
printf("%d/n",lst);
}
return 0;
}
解题思路:这是一个求最优解的题目,可以采用动态规划的方法。首先,找出原始问题的最优子结构。
假设序列A1...Ai-1(i<n)是输入序列的一个子序列,其中存在一个元素Ak(k<=i-1)为A0...Ai-1中最长子序列的最后一个元素,此时对于子序列A1...Ai分两种情况,如果Ai>Ak,则A1...Ai中最长递增子序列长度为A1...Ai-1中最长子序列长度加1,否则和A1...Ai-1中最长递增子序列长度相同。如此可以得到一个递归式:设数组L1...Ln存诸子序列A1...A1,A1...A2,A1...A3,A1...An中最长递增子序列的长度,则可以得到一个递归式:
[1 i=1;
L[i]=[MAX(L[1]...L[i-1]) 1<i<=n,Ai<=Ak
[MAX(L[1]...L[i-1])+1 1<i<=n,Ai>Ak
根据上式构造最优结构即最长公共子序列,代码如下:
#include <stdio.h>
#define MAXSIZE 10000
int LstSub(int A[],int n)
{
int L[MAXSIZE],i,j,k,max;
L[0]=1;
for(i=1;i<n;i++)
{
max=0X80000000;
for(j=0;j<i;j++)
{
if(L[j]>max)
{ max=L[j]; k=j; }
}
if(A[i]>A[k])
L[i]=max+1;
else
L[i]=max;
}
return L[n-1];
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int A[MAXSIZE],i,lst;
for(i=0;i<n;i++)
scanf("%d",A+i);
lst=LstSub(A,n);
printf("%d/n",lst);
}
return 0;
}
相关文章推荐
- 什么是动态规划?动态规划典型例题求解+代码
- 原根(详解+代码实现+例题+快速求解一个数的原根)
- C求解一个数二进制1的个数
- 动态规划求解0-1背包问题
- 例题;假设一张纸厚度为0.001米,对折多少次高度可以超过珠峰高度(8848)米。一个篮球第二次弹起的高度是第一次弹起高度的2/3,问弹起n次以后的高度是多少。 主要学习for循环
- 例题:函数递归。去卖羊,每过一个村子卖掉之前数的二分之一零一只,过了7个村之后还剩2只,问最初有多少羊。
- 关于一个算法的求解
- java求解一个线性规划约束问题
- Tarjan算法求解一个无向图中的割点和桥问题
- 原根-快速求解一个数的原根
- 原根-快速求解一个数的原根
- 动态规划 求解 Minimum Edit Distance
- java实现动态规划求解矩阵连乘问题
- 【例子】一个小益智游戏(过河游戏)的求解
- 例题:在链表中查找一个字符串,并插入另一个字符串
- K好数(动态规划求解)
- 【经典例题】编写一个函数,求第n个斐波那契数
- [置顶] HDU 动态规划(46道经典例题)
- 0-1背包问题,动态规划求解
- PHP求解一个值是否为质数