#include <stdlib.h>
#include "oj.h"
#include <iostream>
using namespace std;
int lASS(int *a,int n,bool(*pfun)(int,int),int* f)
{
f[1]=1; //数组f用来记录从元素1开始截止到下表i的最长递增子序列的长度
//这里f[1]必须初始化为
for(int i=2;i<=n;i++)//自底向上增加问题的规模,则f[n]就存储了从1到n的最长递增子序列的长度
{
f[i]=1;// 先初始化一个比较小的值
//for(int j=i-1;j>0;j--)//遍历第i个元素前面的所有元素
for(int j=1;j<i;j++)//遍历第i个元素前面的所有元素
{
if(f[j]+1>f[i])//如果到下标j的最长递增子序列长度+1比当前f[i]大
{
if(pfun(a[j],a[i])) //如果a[j]<a[i]
{
f[i]=f[j]+1;//则截止到i的最长递增子序列可增一
}
}
}//for
cout<<"f["<<i<<"]="<<f[i]<<endl;
}
int max=1;
for(int i=1;i<=n;i++)
if(max<f[i]) max=f[i];
return max;
}//function
int lDSS(int *a,int n,bool(*pfun)(int,int),int* f)
{
f[n]=1; //数组f用来记录从元素1开始截止到下表i的最长递增子序列的长度
//这里f[1]必须初始化为
for(int i=n-1;i>0;i--)//自底向上增加问题的规模,则f[n]就存储了从1到n的最长递增子序列的长度
{
f[i]=1;// 先初始化一个比较小的值
//for(int j=i-1;j>0;j--)//遍历第i个元素前面的所有元素
for(int j=n;j>i;j--)//遍历第i个元素前面的所有元素
{
if(f[j]+1>f[i])//如果到下标j的最长递增子序列长度+1比当前f[i]大
{
if(pfun(a[j],a[i])) //如果a[j]<a[i]
{
f[i]=f[j]+1;//则截止到i的最长递增子序列可增一
}
}
}//for
cout<<"f["<<i<
合唱队问题的动态规划解法
最新推荐文章于 2024-08-15 14:32:03 发布