1、最長公共序列(lcs)
#include #include using namespace std;
#define up 1
#define left 2
#define slope 3
int dp[50][50];
int road[50][50];
char a = "algorithm";
char b = "altruistic";
void print(int x, int y)
else if(road[x][y] == left)
print(x, y-1);
else
print(x-1, y);
}int lcs()
else
}} return dp[len1][len2];
}int main(void)
2、最大子串行和
#include using namespace std;
int a = ;
int dp[30], x = -1;
int lss()
} return ret;
}void suffix()
cout << "具有最大和子串行的下標位置為:" << i+1 << " " << x << endl;
}int main(void)
3、最長遞增子串行長度(lis)
#include using namespace std;
int a = ;
int dp[25];
int lis()
if(ret < dp[i])
ret = dp[i];
} return ret;
}int main(void)
4、最長連續公共子串行長度(最長公共子串)
#include using namespace std;
int opt[65535];
int max(int a, int b)
int maxsublen(const char *src, const char *trg)
else
opt[i] = 0;
} }return largest;
}int main(void)
5、矩陣最大子矩陣和
#include using namespace std;
const int m = 3, n = 3;
int a[10][10] = , ,
};int b[10];
int dp[10];
int start, end;
int lss()
else
dp[i] = dp[i-1] + b[i];
// res = dp[i] > res ? dp[i] : res;
if(dp[i] > res)
}return res;
}int main(void)
}int t = lss();
if(maxv < t)
} }
cout << "第" << x1+1 << "行到" << x2 + 1 << "行,第" << y1+1 << "列到第" << y2+1 << "列構成的子矩陣和最大,為:" << maxv << endl;
return 0;
}
動態規劃解最長公共子串行問題
動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是...
動態規劃解最長公共子串行問題
動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是...
動態規劃解最長公共子串行問題
動態規劃法 經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是...