![]()
![]()
#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];
}
};