矩阵链乘
#include <bits/stdc++.h>
using namespace std;
int m;
int r[1000];
int M[1000][1000];
int n = 0;
int s[1000][1000];
void Print(int i, int j) {
if (i == j) {
cout << "A" << i;
} else {
cout << "(";
Print(i, s[i][j]);
Print(s[i][j] + 1, j);
cout << ")";
}
}
int main() {
cin >> m;
while (m--) {
int a;
while (cin >> a) {
r[n++] = a;
char c = cin.get();
if (c == '\n')
break;
}
n--;
for (int i = 1; i <= n; i++) {
M[i][i] = 0;
}
for (int l = 2; l <= n; l++) {
for (int i = 1; i <= n - l + 1; i++) {
int j = i + l - 1;
M[i][j] = M[i + 1][j] + r[i - 1] * r[i] * r[j];
s[i][j] = i;
for (int k = i + 1; k < j; k++) {
int t = M[i][k] + M[i + 1][j] + r[i - 1] * r[k] * r[j];
if (t < M[i][j]) {
M[i][j] = t;
s[i][j] = k;
}
}
}
}
cout << M[1][n] << endl;
Print(1, n);
n = 0;
}
}
0-1背包
#include <bits/stdc++.h>
using namespace std;
int n, W;
void knapsack();
void Opimal(vector<vector<int> > &M, vector<int> &w);
int main() {
cin >> n >> W;
knapsack();
return 0;
}
void knapsack() {
vector<int> v(n + 1, 0);
vector<int> w(n + 1, 0);
vector<vector<int> > M(n + 1, vector<int>(W + 1));
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
for (int i = 1; i <= n; i++) {
cin >> w[i];
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= W; j++) {
if (j < w[i])
M[i][j] = M[i - 1][j];
else {
M[i][j] = max(M[i - 1][j - w[i]] + v[i], M[i - 1][j]);
}
}
}
cout << M[n][W] << endl;
Opimal(M, w);
}
void Opimal(vector<vector<int> > &M, vector<int> &w) {
vector<int> result;
int i = n;
int j = W;
while (i > 0) {
if (M[i][j] == M[i - 1][j]) {
result.push_back(0);
i--;
} else {
result.push_back(1);
j = j - w[i];
i--;
}
}
for (int i = result.size() - 1; i >= 0; i--) {
cout << result[i] << " ";
}
}
#include <bits/stdc++.h>
using namespace std;
int n, W;
void knapsack();
int main() {
cin >> n >> W;
knapsack();
return 0;
}
void knapsack() {
vector<int> v(n + 1, 0);
vector<int> w(n + 1, 0);
vector<int> M(W + 1);
for (int i = 1; i <= n; i++) {
cin >> v[i];
}
for (int i = 1; i <= n; i++) {
cin >> w[i];
}
for (int i = 1; i <= n; i++) {
for (int j = W; j > 0; j--) {
if (j < w[i])
M[j] = M[j];
else {
M[j] = max(M[j - w[i]] + v[i], M[j]);
}
}
}
for (int j = 1; j <= W; j++) {
cout << M[j] << " ";
}
cout << endl;
cout << M[W] << endl;
}
最长递增子序列
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
while (N--) {
string s;
cin >> s;
int n = s.length();
vector<int> M(n + 1, 1);
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
if (s[j] >= s[i])
continue;
else {
M[i] = max(M[i], M[j] + 1);
}
}
}
cout << M[n - 1];
}
}
#include <bits/stdc++.h>
using namespace std;
string s;
vector<int> M;
void BinaryInsert(char c, int l, int r) {
if (l > r) {
return ;
}
int mid = (r - l) / 2 + l;
if (M[mid] == c)
return;
if (M[mid] < c) {
if (M[mid + 1] > c) {
M[mid + 1] = c;
} else {
BinaryInsert(c, mid + 1, r);
}
} else {
if (M[mid - 1] < c) {
M[mid] = c;
} else {
BinaryInsert(c, l, mid);
}
}
}
int main() {
int N;
cin >> N;
while (N--) {
cin >> s;
int n = s.length();
char c = 0;
for (int i = 0; i < n; i++) {
if (s[i] > c) {
M.push_back(s[i]);
} else if (s[i] < c) {
BinaryInsert(s[i], 0, M.size() - 1);
}
c = M[M.size() - 1];
}
cout << M.size() << endl;
M.clear();
}
}
最长公共子序列
#include <bits/stdc++.h>
using namespace std;
int c[1001][1001];
int b[1001][1001];
string s1;
string s2;
void LCS(string s1, string s2, int n1, int n2);
void LCS_result(int i, int j);
int main() {
int N;
cin >> N;
while (N--) {
cin >> s1 >> s2;
int n1 = s1.length();
int n2 = s2.length();
LCS(s1, s2, n1, n2);
}
}
void LCS(string s1, string s2, int n1, int n2) {
for (int i = 1; i <= n1; i++) {
for (int j = 1; j <= n2; j++) {
if (s1[i - 1] == s2[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = 1;
} else {
if (c[i - 1][j] >= c[i][j - 1]) {
c[i][j] = c[i - 1][j];
b[i][j] = 2;
} else {
c[i][j] = c[i][j - 1];
b[i][j] = 3;
}
}
}
}
cout << c[n1][n2] << endl;
LCS_result(n1, n2);
cout << endl;
}
void LCS_result(int i, int j) {
if (i == 0 || j == 0) {
return;
}
if (b[i][j] == 1) {
LCS_result(i - 1, j - 1);
cout << s1[i - 1];
} else if (b[i][j] == 2) {
LCS_result(i - 1, j);
} else {
LCS_result(i, j - 1);
}
}
最优二叉搜索树
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
const double INF = 99999;
int n;
double p[N];
double q[N];
double w[N][N];
double e[N][N];
int re[N][N];
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> p[i];
}
for (int i = 0; i <= n; i++) {
cin >> q[i];
}
for (int i = 1; i <= n + 1; i++) {
for (int j = 0; j <= n; j++) {
if (j == i - 1) {
w[i][j] = q[j];
e[i][j] = q[j];
}
}
}
for (int l = 1; l <= n; l++) {
for (int i = 1; i <= n - l + 2; i++) {
int j = i + l - 1;
w[i][j] = w[i][j - 1] + p[j] + q[j];
e[i][j] = INF;
for (int r = i; r <= j; r++) {
if (e[i][r - 1] + e[r + 1][j] + w[i][j] < e[i][j]) {
e[i][j] = e[i][r - 1] + e[r + 1][j] + w[i][j];
re[i][j] = r;
}
}
}
}
for (int i = 1; i <= n + 1; i++) {
for (int j = 0; j <= n; j++) {
cout << w[i][j] << " ";
}
cout << endl;
}
for (int i = 1; i <= n + 1; i++) {
for (int j = 0; j <= n; j++) {
cout << e[i][j] << " ";
}
cout << endl;
}
for (int i = 1; i <= n + 1; i++) {
for (int j = 0; j <= n; j++) {
cout << re[i][j] << " ";
}
cout << endl;
}
}