zoukankan      html  css  js  c++  java
  • 动态规划(简单)

    1.最长公共子序列

    char a[1005];
    char b[1005];
    int ans[1005][1005];
    int mmp(){
    int lena=strlen(a);
    for (int i=0;i<=lena;i++)
        ans[i][1]=0;
    int lenb=strlen(b);
    for (int i=0;i<=lenb;i++)
        ans[1][i]=0;
    for (int i=1;i<=lena;i++){
        for (int j=1;j<=lenb;j++){
            if(a[i-1]==b[j-1])
                ans[i][j]=ans[i-1][j-1]+1;
            else ans[i][j]=max(ans[i-1][j],ans[i][j-1]);
        }
     }
    return ans[lena][lenb];
    }

    2.最长公共子序列(最长上升子序列写法)

    void jie(){
       int n,p,q,dp,right,left,mid;
     
       scanf("%d%d%d",&n,&p,&q);
       p++;
       q++;
       int m;
       int top;
       memset(a,0,sizeof(a));
       for (int i=1;i<=p;i++){
        scanf("%d",&m);
        a[m]=i;
       }
       ans[0]=top=0;
       for (int i=1;i<=q;i++){
        scanf("%d",&m);
         dp=a[m];
        if(!dp) continue;
        if(dp>ans[top]){
            ans[++top]=dp;
        }
        else {
            left=0;
            right=top;
            mid;
            while(1){
                mid=(right+left)/2;
                if(mid==left) break;
                if(dp>ans[mid])
                    left=mid;
                else
                    right=mid;
            }
            ans[mid+1]=dp;
         }
       }
       printf("%d
    ",top);
    }

    3.最长上升子序列

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    usingnamespacestd;
    int a[100000];
    int chang[100000];
    int main(){
        int n;
        scanf("%d",&n);
        int sum=1;
        int cnt=0;
        int flag;
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
            chang[i]=1;
        }
        for(int i=1;i<n;i++){
            for(int j=0;j<i;j++){
                if(a[i]>a[j]){
                    chang[i]=max(chang[i],chang[j]+1);
                }
                 if(chang[i]>sum)sum=chang[i];
            }
        }
        printf("%d
    ",sum);
        return0;
    }

    4.最长上升子序列(二分)

    #include<stdio.h>
    int a[100000];
    int ans[100000];
    int main(){
    int n;
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
    }int top=1;
    ans[1]=a[1];for (int i=2;i<=n;i++){
        if(ans[top]<a[i])
            ans[++top]=a[i];
        else{
            int mid;
            int left=1;
            int right=top;
            while(left<=right){
                mid=(left+right)/2;
                if(a[i]>ans[mid])
                    left=mid+1;
                else right=mid-1;
            }
            ans[left]=a[i];
        }
    }
    printf("%d
    ",top);
    return0;
    }
  • 相关阅读:
    Charles的使用教程
    Sublime Text 3 无法使用package control安装插件解决办法
    sublime常用快捷键整理(未完待续)
    常用 Git 命令清单
    js判断的执行顺序
    使用CSS3 Media Queries实现网页自适应(转)
    移动前端开发之viewport的深入理解(转)
    javascript之函数节流
    String常用方法总结
    腾讯面试题1
  • 原文地址:https://www.cnblogs.com/lmjer/p/7582788.html
Copyright © 2011-2022 走看看