動態規劃

目錄

01揹包

完全揹包

最長上升子序列

最長公共子序列


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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章