Skip to content

Commit 0a6b3c0

Browse files
committed
codes: dp'
1 parent 567ffa9 commit 0a6b3c0

File tree

6 files changed

+87
-0
lines changed

6 files changed

+87
-0
lines changed

codes/DP/kadane.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
int kadane(const vector<int>& as) {
2+
vector<int> s(as.size());
3+
s[0] = as[0];
4+
5+
for (size_t i = 1; i < as.size(); ++i)
6+
s[i] = max(as[i], s[i - 1] + as[i]);
7+
8+
return *max_element(s.begin(), s.end());
9+
}

codes/DP/lis.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
int LIS(int N, const vector<int>& as) {
2+
vector<int> lis(N + 1, oo);
3+
lis[0] = -oo;
4+
auto ans = 0;
5+
for (int i = 0; i < N; ++i) {
6+
auto it = lower_bound(lis.begin(), lis.end(), as[i]);
7+
auto pos = (int) (it - lis.begin());
8+
ans = max(ans, pos);
9+
lis[pos] = as[i];
10+
}
11+
return ans;
12+
}

codes/DP/max2dRS-K.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
int kadane(int N, const vector<int>& as) {
2+
vector<int> s(N + 1);
3+
s[1] = as[1];
4+
for (size_t i = 2; i < as.size(); ++i)
5+
s[i] = max(as[i], s[i - 1] + as[i]);
6+
return *max_element(s.begin() + 1, s.end());
7+
}
8+
9+
int MSR(int N, int M, const vector<vector<int>>& A) {
10+
int ans = -oo;
11+
for (int i = 1; i <= M; ++i) {
12+
vector<int> r(N + 1, 0);
13+
14+
for (int j = i; j <= M; ++j) {
15+
for (int k = 1; k <= N; ++k)
16+
r[k] += A[k][j];
17+
18+
ans = max(ans, kadane(N, r));
19+
}
20+
}
21+
return ans;
22+
}

codes/DP/maxRS-PS.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
long long MRS(const vector<int>& as)
2+
{
3+
auto N = as.size() - 1;
4+
vector<long long> ps(N + 1, 0);
5+
// O código assume que os índices da sequência as começam em 1
6+
for (size_t i = 1; i <= N; ++i)
7+
ps[i] = ps[i - 1] + as[i];
8+
9+
long long ans = -oo;
10+
for (size_t i = 1; i <= N; ++i)
11+
for (size_t j = i; j <= N; ++j)
12+
ans = max(ans, ps[j] - ps[i - 1]);
13+
14+
return ans;
15+
}

codes/DP/maxSSM.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
int A[MAX][MAX], S[MAX][MAX];
2+
int MSS(int N, int M) {
3+
for (int i = 0; i < N; ++i)
4+
S[i][0] = A[i][0];
5+
for (int j = 0; j < M; ++j)
6+
S[0][j] = A[0][j];
7+
8+
int ans = 0;
9+
for (int i = 1; i < N; ++i)
10+
for (int j = 1; j < M; ++j) {
11+
S[i][j] = A[i][j] == 0 ? 0 : min({ S[i-1][j], S[i][j-1], S[i-1][j-1] }) + 1;
12+
13+
ans = max(ans, S[i][j]);
14+
}
15+
return ans;
16+
}

codes/DP/tsp.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
int dist[MAX][MAX];
2+
int st[MAX][1 << MAX];
3+
int tsp(int i, int mask, int N) {
4+
if (mask == (1 << N) - 1) return dist[i][0];
5+
if (st[i][mask] != -1) return st[i][mask];
6+
int res = oo;
7+
for (int j = 0; j < N; ++j) {
8+
if (mask & (1 << j)) continue;
9+
10+
res = min(res, tsp(j, mask | (1 << j), N) + dist[i][j]);
11+
}
12+
return (st[i][mask] = res);
13+
}

0 commit comments

Comments
 (0)