zoukankan      html  css  js  c++  java
  • dp的一些练习

    #include<iostream>
    #include<vector>
    using namespace std;
    class Backpack  
    {  
    public:          
        int maxValue(vector<int> w, vector<int> v, int n, int cap)           
        {                  
            int **dp=new int*[n];                  
            for(int i=0;i<n;i++)                          
                dp[i]=new int[cap+1]();                  
            for(int i=0;i<n;i++)                          
                dp[i][0]=0;                  
            for(int i=0;i<cap+1;i++)                  
            {                          
                if(i>=w[0])                                 
                    dp[0][i]=v[0];                          
                else                               
                    dp[0][i]=0;                  
            }                  
            for(int i=1;i<n;i++)                          
                for(int j=1;j<cap+1;j++)                      
                {                               
                    if((j-w[i])>=0)                                       
                        dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);                               
                    else                                     
                        dp[i][j]=dp[i-1][j];                      
                }                  
            int res=dp[n-1][cap];                  
            for(int i=0;i<n;i++)                          
                delete []dp[i];                  
            delete []dp;                  
            return res;          
        }  
    }; 
    
    
    int main()
    {
        int a[8]={42,25,30,35,42,21,26,28};
        int b[8]={261,247,419,133,391,456,374,591};
        vector<int> arr(a,a+8);
        vector<int> brr(b,b+8);
        Backpack B;
        cout<<B.maxValue(arr,brr,8,297);
        return 0;
    }

    #include<iostream>
    #include<vector>
    using namespace std;
    class LCS {
    public:
        int findLCS(string A, int n, string B, int m) 
        {
            int **dp=new int*[n];
            for(int i=0;i<n;i++)
                dp[i]=new int[m];
            for(int i=0,temp=0;i<n;i++)
            {
                if(B[0]==A[i])
                    temp=1;
                dp[i][0]=temp;
            }
            for(int i=0,temp=0;i<m;i++)
            {
                if(A[0]==B[i])
                    temp=1;
                dp[0][i]=temp;
            }
            for(int i=1;i<n;i++)
                for(int j=1;j<m;j++)
                {
                    //选择三种情况中dp[i][j]最大的
                    int m=max(dp[i-1][j],dp[i][j-1]);
                    if(A[i]==B[j])
                        m=max(dp[i-1][j-1]+1,m);
                    dp[i][j]=m;
                }
                return dp[n-1][m-1];
        }
    };
    
    int main()
    {
        string A="1A2C3D4B56",B="B1D23CA45B6A";
        LCS f;
        cout<<f.findLCS(A,10,B,12);
        return 0;
    }

    #include<iostream>
    #include<vector>
    using namespace std;
    class LongestIncreasingSubsequence {
    public:
        int getLIS(vector<int> A, int n) 
        {
            int *dp=new int[n],res=0;
            dp[0]=1;
            for(int i=1;i<A.size();i++)
            {
                int max=0,j=0;
                while(j<i)
                {
                    if(A[j]<A[i]&&dp[j]>max)
                        max=dp[j];
                    j++;
                }
                dp[i]=max+1;
            }
            for(int i=0;i<A.size();i++)
                if(res<dp[i])
                    res=dp[i];
            return res;
        }
    };

    #include<iostream>
    #include<vector>
    using namespace std;
    class MinimumPath {
    public:
        int getMin(vector<vector<int> > map, int n, int m) 
        {
            int **dp=new int *[n];
            for(int i=0;i<n;i++)
                dp[i]=new int[m];
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                    dp[i][j]=0;
            dp[0][0]=map[0][0];
            for(int i=1;i<n;i++)
                dp[i][0]=dp[i-1][0]+map[i][0];
            for(int i=1;i<m;i++)
                dp[0][i]=dp[0][i-1]+map[0][i];
            for(int i=1;i<n;i++)
                for(int j=1;j<m;j++)
                    dp[i][j]=min(dp[i-1][j],dp[i][j-1])+map[i][j];
            return dp[n-1][m-1];
        }
    };

    class GoUpstairs {
    public:
        int countWays(int n) 
        {
            int *dp=new int[n];
            dp[0]=1;
            dp[1]=2;
            for(int i=2;i<n;i++)
                dp[i]=(dp[i-1]+dp[i-2])%Mod;
            return dp[n-1];
        }
    };

    #include<iostream>
    #include<vector>
    using namespace std;
    //动态规划
    class Exchange {
    public:
        int countWays(vector<int> penny, int n, int aim) 
        {
            if(n==0||aim<0)
                return 0;
            int **map=new int*[n];
            for(int i=0;i<n;i++)
                map[i]=new int[aim+1];
            for(int i=0;i<n;i++)
                for(int j=0;j<aim+1;j++)
                    map[i][j]=-1;
            for(int i=0;i<n;i++)
                map[i][0]=1;
            for(int i=0;i<aim+1;i++)
                if(i%penny[0]==0)
                    map[0][i]=1;
                else 
                    map[0][i]=0;
            for(int i=1;i<n;i++)
                for(int j=1;j<aim+1;j++)
                    if((j-penny[i])>=0)
                        map[i][j]=map[i][j-penny[i]]+map[i-1][j];
                    else
                        map[i][j]=map[i-1][j];
            return map[n-1][aim];
        }
    
    };
    
    
    /*记忆搜索
    class Exchange {
    public:
        int countWays(vector<int> penny, int n, int aim) 
        {
            if(n==0||aim<0)
                return 0;
            int **map=new int*[n];
            for(int i=0;i<n;i++)
                map[i]=new int[aim+1];
            for(int i=0;i<n;i++)
                for(int j=0;j<aim+1;j++)
                    map[i][j]=-1;
            return process(penny,0,aim,map);
    
        }
        int process(vector<int> arr,int index,int aim,int **map)
        {
            int res;
            if(arr.size()-1==index)
            {
                if(map[index][aim]==-1)
                    map[index][aim]=(aim%arr[index])?0:1;
                return map[index][aim];
            }
            else
            {
                res=0;
                int k=aim/arr[index];
                for(int i=0;i<=k;i++)
                {
                    if(map[index+1][aim-i*arr[index]]==-1)
                        map[index+1][aim-i*arr[index]]=process(arr,index+1,aim-i*arr[index],map);
                    res+=map[index+1][aim-i*arr[index]];
                }
            }
            return res;
        }
    };*/
    
    /*暴力搜索
    class Exchange {
    public:
        int countWays(vector<int> penny, int n, int aim) 
        {
            if(n==0||aim<0)
                return 0;
            return process(penny,0,aim);
    
        }
        int process(vector<int> arr,int index,int aim)
        {
            int res;
            if(arr.size()-1==index)
            {
                res=(aim%arr[index])?0:1;
                return res;
            }
            else
            {
                res=0;
                int k=aim/arr[index];
                for(int i=0;i<=k;i++)
                    res+=process(arr,index+1,aim-i*arr[index]);
            }
            return res;
        }
    };*/
    
    int main()
    {
        int a[3]={1,2,3};
        vector<int> arr(a,a+3);
        Exchange e;
        cout<<e.countWays(arr,3,3);
        
        return 0;
    }

    class MinCost {
    public:
        int findMinCost(string A, int n, string B, int m, int c0, int c1, int c2) //c0²åÈ룬c1ɾ³ý£¬c2Ìæ»»
        {
            int **dp=new int*[n+1];
            for(int i=0;i<n+1;i++)
                dp[i]=new int[m+1];
            for(int i=0;i<n+1;i++)
                dp[i][0]=i*c1;
            for(int i=0;i<m+1;i++)
                dp[0][i]=i*c0;
            for(int i=1;i<n+1;i++)
                for(int j=1;j<m+1;j++)
                {
                    int temp1=0,temp2=0,res;
                    temp1=min(dp[i][j-1]+c0,dp[i-1][j]+c1);
                    if(A[i-1]==B[j-1])
                        temp2=dp[i-1][j-1];
                    else
                        temp2=dp[i-1][j-1]+c2;
                    res=min(temp1,temp2);
                    dp[i][j]=res;
                }
                return dp[n][m];
        }
    };
  • 相关阅读:
    java中继承和多态的理解
    汽车租赁系统
    s2第六章继承和多态
    第三章泛型集合ArrayList 和Hashtable
    第二章项目总结
    s2第二章深入c#类型
    .NET平台
    航班查询系统
    java初始重点语法
    JDBC
  • 原文地址:https://www.cnblogs.com/tianzeng/p/11291558.html
Copyright © 2011-2022 走看看