题目:1259:【例9.3】求最长不下降序列(http://ybt.ssoier.cn:8088/problem_show.php?pid=1259)
思路:
令f[i]为从1到i的最长不下降序列长度
假设a[i]<=a[j],那么就构成了一个不下降序列(不用相邻)
假如加上这个数,序列比原来更长,那么就加上;若序列没有原来长,那么就不变
所以状态转移方程为f[i]=f[j]+1或f[i]不变
最后输出的长度即为所有长度中最长的
输出序列时,从记下的最后一个下标往前输出(用递归思想)
代码:
#include<iostream>
using namespace std;
void out(int x,int m[],int k);
int a[201];
int main()
{
int n,i,j,f[201]={0},p[201]={0},maxn=0,l; //令f[i]为从1到i的最长不下降序列长度
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a[i];
f[i]=1; //每一个数最少都有本身长度
}
for(i=1;i<n;i++)
{
for(j=i+1;j<=n;j++)
{
if(a[j]>=a[i]&&f[j]<f[i]+1)
{
f[j]=f[i]+1;
p[j]=i; //记下当前序列中上一个数的下标
}
}
}
for(i=1;i<=n;i++)
{
if(maxn<f[i])
{
maxn=f[i];
l=i; //记下序列中最后一个数的下标
}
}
cout<<"max="<<maxn<<