线性DP2018-08-06

线性DP就是在DP的基础上可以画一颗树,更好理解。
一道例题:http://172.45.253.16:8080/problem/8
第一种方法:最朴素的暴力算法,先算出所有的子序列,看符合条件的数列,再统计其中的最大值,显然,这种方法很容易超时。
第二种方法:直接暴搜
第三种方法:线性DP,先设所有为1,数列里面的每一个数都向前看,发现比自己小的就转换,这样就很容易得出转移方程f[i]=Max{f[j]+1}(i>j,a[j]>a[i]),(j=1——i-1)
附上代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn=100+6;
int f[maxn],a[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
        f[i]=1;
    for(int i=1;i<=n;i++) 
        for(int j=1;j<i;j++)
            if(a[j]>a[i])
               f[i]=max(f[i],f[j]+1);
    int ans=-1;
    for(int i=1;i<=n;i++)
        ans=max(f[i],ans);
        cout<<ans;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42875611/article/details/81462052