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]; } };