旅行商问题
//旅行商问题
//dp[S][v]表示在 S 已被访问时从 v 出发访问的最小值
//递归版
int n;
vector<vector<int> > d;
int dp[1 << MaxN][MaxN];
memset(dp, -1, sizeof(dp));
int TSP(int S, int v){
if(dp[S][v] >= 0){
return dp[S][v];
}
if(S == (1 << n) - 1 && v == 0){
return dp[S][v] = 0;
}
int res = 0x3f3f3f3f;
for(int u = 0; u < n; u++){
if(!(S >> u & 1)){
res = min(res, TSP((S | (1 << u)), u) + d[v][u])
}
}
return dp[S][v] = res;
}
TSP(0, 0);
//循环版
int TSP(vector<vector<int> >& d){
int n = d.size();
int dp[1 << n][n];
memset(dp, 0x3f3f3f3f, sizeof(dp));
dp[(1 << n) - 1][0] = 0;
for(int S = (1 << n) - 2; S >= 0; S--){
for(int v = 0; v < n; v++){
for(int u = 0; u < n; u++){
if(!(S >> u & 1)){
dp[S][v] = min(dp[S][v], dp[S | (1 << u)][u] + d[v][u]);
}
}
}
}
return dp[0][0];
}
编辑距离
int minDistance(string word1, string word2) {
int m = word1.size(),n = word2.size();
int dp[m + 1][n + 1];
dp[0][0] = 0;
for(int i = 1;i <= m;i++){
dp[i][0] = i;
}
for(int i = 1;i <= n;i++){
dp[0][i] = i;
}
for(int i = 1;i <= m;i++){
for(int j = 1;j <= n;j++){
if(word1[i - 1] == word2[j - 1]){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = min(dp[i][j - 1], min(dp[i - 1][j], dp[i - 1][j - 1]));
dp[i][j] = dp[i][j] + 1;
}
}
}
return dp[m][n];
}


