目錄
01揹包
int N,V; // 物品數量、揹包重量
int value[MAX],volume[MAX]; // 物品價值、物品重量
int dp[MAX]; // dp結果
void solve(){
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
for(int j=V;j>=volume[i];j--)
dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
return dp[V];
}
完全揹包
int N,V; // 物品數量、揹包重量
int value[MAX],volume[MAX]; // 物品價值、物品重量
int dp[MAX]; // dp結果
void solve(){
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
for(int j=volume[i];j<=V;j++)
dp[j]=max(dp[j],dp[j-volume[i]]+value[i]);
return dp[V];
}
最長上升子序列
int arr[MAX]; // 原始序列
int dp[MAX],len; // 存最長上升序列
int LIS(){
memset(dp,0,sizeof(dp));
dp[1]=arr[1];len=1;
for(int i=2,j=0;i<=n;i++){
j=lower_bound(dp+1,dp+1+len,arr[i])-dp;
dp[j]=arr[i];
len=max(len,j);
}
return len;
}
最長公共子序列
int dp[MAX][MAX];
int LCS(string a,string b){
int lena=a.size();
int lenb=b.size();
memset(dp,0,sizeof(dp));
for(int i=1;i<=lena;i++){
for(int j=1;j<=lenb;j++){
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[lena][lenb];
}