动态规划入门(二)

来源:互联网 发布:幼儿园虐童 知乎 编辑:程序博客网 时间:2024/06/03 21:35

例1.最长不下降子序列
这没有什么好讲的,就是不断枚举前面的。。。遇到可以更新就更新,最后输出!
见代码


#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;int f[100001],p[100001],a[100001];void out(int i){    if(p[i]!=0)out(p[i]);    printf("%d ",a[i]);}int main(){    int i,j,k,n,m;    scanf("%d",&n);    for(i=1;i<=n;i++)        scanf("%d",&a[i]);    int ans=0;    for(i=1;i<=n;i++){        int t=0;        for(j=1;j<i;j++)            if(f[j]>f[t] && a[j]<a[i])                 t=j;        p[i]=t;f[i]=f[t]+1;        if(f[i]>f[ans])ans=i;    }    printf("max=%d\n",f[ans]);    out(ans);    return 0;} 

例2.导弹拦截
第一问:一个最长不上升子序列
第二问:一个最长上升子序列(据贪心法分析得)

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<iostream>using namespace std;int f1[100001],a[100001],f[100001];int main(){    int i,j,k,n=0,m;    while(!feof(stdin)){        scanf("%d",&a[++n]);    }    int ans=0,ans1=0;n--;    for(i=1;i<=n;i++){        int t=0,t1=0;        for(j=1;j<i;j++){            if(f[j]>f[t] && a[i]<a[j])t=j;            if(f1[j]>f1[t1] && a[i]>a[j])t1=j;        }        f[i]=f[t]+1;f1[i]=f1[t1]+1;        if(ans<f[i])ans=f[i];        if(ans1<f1[i])ans1=f1[i];    }    printf("%d\n%d\n",ans,ans1);    return 0;} 

推荐几篇动态规划的博客
六,五,四,三,二,一

0 0