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的一些练习的主要内容,如果未能解决你的问题,请参考以下文章