dp的一些练习

Posted tianzeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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];
    
;

 

以上是关于dp的一些练习的主要内容,如果未能解决你的问题,请参考以下文章

DP练习

dp练习

2023-05-04 线性DP_力扣练习

编程练习赛11B 物品价值(装压dp)

区间dp专题练习

牛客练习赛52 C.烹饪 DP + gcd性质