zoukankan      html  css  js  c++  java
  • 动态规划-专题

    LCS 最长公共子序列

    class Solution {
    public:
        /**
         * @param A, B: Two strings.
         * @return: The length of longest common subsequence of A and B.
         */
        int longestCommonSubsequence(string A, string B) {
            // write your code here
            int lena=A.length(),lenb=B.length();
            int dp[lena][lenb];
            memset(dp,0,sizeof(dp));
            for(int i=0;i<lena;i++)
            {
                if(A[i]==B[0]) dp[i][0]=1;
            }
            for(int j=0;j<lenb;j++)
            {
                if(B[j]==A[0]) dp[0][j]=1;
            }
            for(int i=1;i<lena;i++)
            {
                for(int j=1;j<lena;j++)
                {
                    if(A[i]==B[j]) dp[i][j]=dp[i-1][j-1]+1;
                    else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
            return dp[lena-1][lenb-1];
        }
    };
    

      

    最长公共子串(连续)

    int longestCommonSubsequence(string A, string B)
    {
        int lena=A.length(),lenb=B.length();
        int dp[lena][lenb];
        int ret=0;
        for(int i=0;i<lena;i++)
        {
            if(A[i]==B[0])
            {
    
                dp[i][0]=1;
                ret=1;
            }
        }
        for(int i=0;i<lenb;i++)
        {
            if(A[0]==B[i])
            {
                dp[0][i]=1;
                ret=1;
            }
        }
    
        for(int i=1;i<lena;i++)
        {
            for(int j=1;j<lenb;j++)
            {
                if(A[i]==B[j])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                    ret=max(ret,dp[i][j]);
                }
                else dp[i][j]=0;
    
            }
        }
        return ret;
    
    }
    

      最短编辑距离

    int minDistance(string word1, string word2) {
            // write your code here
            int lena=word1.length(),lenb=word2.length();
            int dp[lena+1][lenb+1];
            for(int i=0;i<=lena;i++)
            dp[i][0]=i;
            for(int i=0;i<=lenb;i++)
            dp[0][i]=i;
            for(int i=1;i<=lena;i++)
            {
                for(int j=1;j<=lenb;j++)
                {
                    int del=dp[i-1][j]+1;
                    int ins=dp[i][j-1]+1;
                    int chan=dp[i-1][j-1]+(word1[i-1]==word2[j-1]?0:1);
                    dp[i][j]=min(min(del,ins),chan);
                }
            }
            return dp[lena][lenb];
        }
    

      模式串匹配

    '?' Matches any single character.
    '*' Matches any sequence of characters (including the empty sequence).
    bool isMatch(string s, string p) {
            int lena=s.length(),lenb=p.length();
            bool dp[lena+1][lenb+1];
            memset(dp,false,sizeof(dp));
            dp[0][0]=true;
            for(int i=1;i<=lenb;i++)
            {
                if(dp[0][i-1]==true&&p[i-1]=='*')
                    dp[0][i]=true;
            }
            for(int i=1;i<=lena;i++)
            {
                for(int j=1;j<=lenb;j++)
                {
                    if(p[j-1]=='*')
                        dp[i][j]=dp[i-1][j-1]||dp[i][j-1]||dp[i-1][j];
                    else if(p[j-1]=='?')
                        dp[i][j]=dp[i-1][j-1];
                    else
                        dp[i][j]=(s[i-1]==p[j-1]?dp[i-1][j-1]:false);
                }
                
            }
            return dp[lena][lenb];
            
        }
    

      题型四:乘积最大子序列

    int maxProduct(vector<int>& nums) {
            // write your code here
            if(nums.size()==0) return 0;
            if(nums.size()==1) return nums[0];
            int ret=nums[0],minn=nums[0],maxn=nums[0];
            for(int i=1;i<nums.size();i++)
            {
                if(nums[i]<0)
                {
                    int tmpminn=min(nums[i],maxn*nums[i]);
                    int tmpmaxn=max(nums[i],minn*nums[i]);
                    minn=tmpminn;
                    maxn=tmpmaxn;
                }
                else
                {
                    int tmpminn=min(nums[i],minn*nums[i]);
                    int tmpmaxn=max(nums[i],maxn*nums[i]);
                    minn=tmpminn;
                    maxn=tmpmaxn;
                }
                ret=max(ret,maxn);
                
            }
            return ret;
        }
    

      0-1背包:(就地滚动和01滚动)

    网易2017实习生笔试题:

    一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。 
    输入描述:
    输入包括两行:
    第一行为整数n(1 ≤ n ≤ 50)
    第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。


    输出描述:
    输出一个整数,表示最少需要处理的时间

    输入例子1:
    5
    3072 3072 7168 3072 1024
    

    输出例子1:
    9216
    
     
    #include<iostream>
    #include<vector>
    #include<math.h>
    #include<queue>
    #include<map>
    #include<string>
    #include<sstream>
    #include <string.h>
    using namespace std;
    
    int main() {
        int n;
        cin>>n;
        vector<int> nums;
        nums.resize(n);
        int sum=0;
        for(int i=0;i<n;i++)
        {
            cin>>nums[i];
            nums[i]/=1024;
            sum+=nums[i];
        }
        bool dp[sum/2+1];
        memset(dp,false, sizeof(dp));
        dp[0]=true;
        int ret=0;
        for(int i=0;i<n;i++)
        {
            for(int j=sum/2;j>=nums[i];j--)
            {
                //cout<<j<<" "<<nums[i]<<endl;
                if(dp[j-nums[i]])
                {
                    dp[j]=true;
                    ret=max(ret,j);
                }
    
            }
        }
        cout<<(sum-ret)*1024<<endl;
    
        return 0;
    }
    
    /*
    
    5
    3072 3072 7168 3072 1024
    
     */
    

      

    #include<iostream>
    #include<vector>
    #include<math.h>
    #include<queue>
    #include<map>
    #include<string>
    #include<sstream>
    #include <string.h>
    using namespace std;
    
    int main() {
        int n;
        cin>>n;
        vector<int> nums;
        nums.resize(n);
        int sum=0;
        for(int i=0;i<n;i++)
        {
            cin>>nums[i];
            nums[i]/=1024;
            sum+=nums[i];
        }
        bool dp[2][sum/2+1];
        memset(dp,false, sizeof(dp));
        dp[0][0]=true;
        
        for(int i=1;i<=n;i++)
        {
    
            for(int j=0;j<=sum/2;j++)
            {
                if(dp[(i-1)&1][j])
                {
                    dp[i&1][j]=true;
                    if((j+nums[i-1])<=sum/2)
                    dp[i&1][j+nums[i-1]]=true;
                }
    
            }
        }
        int ret=0;
        for(int i=sum/2;i>=0;i--)
        {
            if(dp[n&1][i])
            {
                ret=i;
                break;
            }
        }
        cout<<(sum-ret)*1024<<endl;
        return 0;
    }
    
    /*
    
    5
    3072 3072 7168 3072 1024
    
     */
    

      

    连续子数组的最大值

    int maxSubArray(vector<int>& nums) {
            if(nums.size()==0) return 0;
            int pre=nums[0],ret=nums[0];
            for(int i=1;i<nums.size();i++)
            {
                if(pre>0)
                {
                    pre+=nums[i];
                }
                else
                {
                    pre=nums[i];
                }
                ret=max(ret,pre);
            }
            return ret;
        }
  • 相关阅读:
    20165336 2017-2018-2《Java程序设计》课程总结
    2017-2018-2 20165336 实验五《网络编程与安全》实验报告
    2017-2018-2 20165336 实验四《Android开发基础》实验报告
    2018-2019-1 20165314 《信息安全系统设计基础》第四周学习总结
    2018-2019-1 20165314 《信息安全系统设计基础》第三周学习总结
    2018-2019-1 20165314《信息安全系统设计基础》实验一 缓冲区溢出漏洞实验
    20165314 [第二届构建之法论坛] 预培训心得(Java版)
    20165314 2017-2018-2《Java程序设计》课程总结
    20165314实验五《网络编程与安全》实验报告
    20165314实验四
  • 原文地址:https://www.cnblogs.com/wuxiangli/p/7294013.html
Copyright © 2011-2022 走看看