DP-Algo
This commit is contained in:
31
Algorithm/DP-DynamicProgramming/Linear-DP/AT_dp_f LCS.cpp
Normal file
31
Algorithm/DP-DynamicProgramming/Linear-DP/AT_dp_f LCS.cpp
Normal file
@@ -0,0 +1,31 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
int main(){
|
||||
string a, b;
|
||||
cin >> a >> b;
|
||||
int a_size = a.size(), b_size = b.size();
|
||||
vector<vector<pair<int, string>>> dp(a.size() + 1, vector<pair<int, string>>(b_size + 1, {0, ""}));
|
||||
for(int i = 1; i <= a_size; i++){
|
||||
for(int j = 1; j <= b_size; j++){
|
||||
if(a[i - 1] == b[j - 1]) {
|
||||
dp[i][j].first = dp[i - 1][j - 1].first + 1;
|
||||
string tmp = dp[i - 1][j - 1].second;
|
||||
tmp.push_back(a[i - 1]);
|
||||
dp[i][j].second = tmp;
|
||||
}
|
||||
else{
|
||||
dp[i][j].first = max(dp[i - 1][j].first, dp[i][j - 1].first);
|
||||
if(dp[i - 1][j].first > dp[i][j - 1].first){
|
||||
dp[i][j].second = dp[i - 1][j].second;
|
||||
}
|
||||
else dp[i][j].second = dp[i][j - 1].second;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
//cout << dp[a_size][b_size].first << " " << dp[a_size][b_size].second << endl;
|
||||
cout << dp[a_size][b_size].second << endl;
|
||||
return 0;
|
||||
}
|
||||
28
Algorithm/DP-DynamicProgramming/Linear-DP/B3637 最长上升子序列.cpp
Normal file
28
Algorithm/DP-DynamicProgramming/Linear-DP/B3637 最长上升子序列.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
struct cmp{
|
||||
bool operator()(const pair<int, int>& a, const pair<int, int>& b){
|
||||
if(a.first != b.first) return a.first > b.first;
|
||||
return a.second < b.second;
|
||||
}
|
||||
};
|
||||
int main(){
|
||||
int n;
|
||||
cin >> n;
|
||||
vector<int> a(n);
|
||||
for(int i = 0; i < n; i++){
|
||||
cin >> a[i];
|
||||
}
|
||||
//dp[i]-><3E><><EFBFBD><EFBFBD>ǰi<C7B0><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> pair(<28><><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>ֵ)
|
||||
vector<int> dp(n, 1);
|
||||
for(int i = 0; i < n; i++){
|
||||
for(int j = 0; j < i; j++){
|
||||
if(a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1);
|
||||
}
|
||||
}
|
||||
int m = *max_element(dp.begin(), dp.end());
|
||||
cout << m << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
int main(){
|
||||
int len, n;
|
||||
cin >> len >> n;
|
||||
vector<int> a(n + 2);
|
||||
vector<vector<int>> dp(n + 2, vector<int>(n + 2, 0));
|
||||
//<2F><><EFBFBD><EFBFBD>dp[i][j]Ϊ<>и<EFBFBD>ľ<EFBFBD><C4BE>[i, j]<5D><> 0|---1|-----2|----3|--4| <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD> a[0] = 0 a[1] = x,,, a[n + 1] = len
|
||||
a[0] = 0; a[n + 1] = len;
|
||||
for(int i = 1; i <= n; i++){
|
||||
cin >> a[i];
|
||||
}
|
||||
//a[i]<5D>Ƿֵ<C7B7>
|
||||
/*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
for(int i = 0; i <= n + 1; i++){
|
||||
for(int j = i; j <= n + 1 ;j++){
|
||||
dp[i][j] = 114514;
|
||||
for(int k = i + 1; k < j; k++){
|
||||
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + a[j] - a[i]);
|
||||
}
|
||||
if(dp[i][j] == 114514) dp[i][j] = 0;
|
||||
}
|
||||
} */
|
||||
// <20><><EFBFBD><EFBFBD> DP<44><50><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>
|
||||
for(int l = 2; l <= n + 1; l++){ // <20><><EFBFBD>䳤<EFBFBD><E4B3A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
|
||||
for(int i = 0; i + l <= n + 1; i++){
|
||||
int j = i + l;
|
||||
dp[i][j] = INT_MAX;
|
||||
for(int k = i + 1; k < j; k++){
|
||||
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j] + a[j] - a[i]);
|
||||
}
|
||||
if(dp[i][j] == INT_MAX) dp[i][j] = 0;
|
||||
}
|
||||
}
|
||||
cout << dp[0][n + 1] << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
|
||||
int main(){
|
||||
ios::sync_with_stdio(false);
|
||||
cin.tie(nullptr);
|
||||
|
||||
int T;
|
||||
if(!(cin >> T)) return 0;
|
||||
while(T--){
|
||||
string s;
|
||||
cin >> s;
|
||||
int n = s.size();
|
||||
if(n == 0){
|
||||
cout << 0 << "\n";
|
||||
continue;
|
||||
}
|
||||
// isPal[i][j] whether s[i..j] is palindrome
|
||||
vector<vector<char>> isPal(n, vector<char>(n, 0));
|
||||
// center expand to fill isPal (or use DP)
|
||||
for(int center = 0; center < n; ++center){
|
||||
// odd length
|
||||
int l = center, r = center;
|
||||
while(l >= 0 && r < n && s[l] == s[r]){
|
||||
isPal[l][r] = 1;
|
||||
--l; ++r;
|
||||
}
|
||||
// even length
|
||||
l = center; r = center + 1;
|
||||
while(l >= 0 && r < n && s[l] == s[r]){
|
||||
isPal[l][r] = 1;
|
||||
--l; ++r;
|
||||
}
|
||||
}
|
||||
|
||||
// dp[i] = min cuts for s[0..i]
|
||||
const int INF = 1e9;
|
||||
vector<int> dp(n, INF);
|
||||
for(int i = 0; i < n; ++i){
|
||||
if(isPal[0][i]){
|
||||
dp[i] = 0;
|
||||
} else {
|
||||
for(int j = 0; j < i; ++j){
|
||||
if(isPal[j+1][i]){
|
||||
dp[i] = min(dp[i], dp[j] + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
cout << dp[n-1] << "\n";
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
const int INF = 1e9;
|
||||
bool match(char a, char b){
|
||||
return (a == '(' && b == ')') || (a == '[' && b == ']');
|
||||
}
|
||||
int main(){
|
||||
string s;
|
||||
cin >> s;
|
||||
int n = s.size();
|
||||
vector<vector<int>> dp(s.size() + 2, vector<int>(s.size() + 2, 1));
|
||||
for(int l = 2; l <= n; l++){
|
||||
for(int i = 0; i < n - l + 1; i++){
|
||||
int j = i + l - 1;
|
||||
dp[i][j] = INF;
|
||||
for(int k = i; k < j; k++){
|
||||
dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
|
||||
}
|
||||
if(match(s[i], s[j])) {
|
||||
if (i + 1 <= j - 1)
|
||||
dp[i][j] = min(dp[i][j], dp[i+1][j-1]);
|
||||
else
|
||||
dp[i][j] = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ƥ<EFBFBD><C6A5>
|
||||
}
|
||||
}
|
||||
}
|
||||
cout << dp[0][n - 1] << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
#include <iostream>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
typedef long long ll;
|
||||
int main(){
|
||||
ll t, m;
|
||||
cin >> t >> m;
|
||||
vector<pair<ll, ll>> arr(m);
|
||||
vector<ll> dp(t + 1, 0);
|
||||
for (int i = 0; i < m; i++) {
|
||||
cin >> arr[i].first >> arr[i].second;
|
||||
}
|
||||
//״̬-> dp[i] = max(dp[i - time[i]] + value[i])
|
||||
for(int i = 1; i < t + 1; i++){
|
||||
for(int j = 0; j < m; j++){
|
||||
if(i - arr[j].first >= 0) dp[i] = max(dp[i], dp[i - arr[j].first] + arr[j].second);
|
||||
}
|
||||
}
|
||||
cout << dp[t] << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
//1<><31>״̬<D7B4>Լ<EFBFBD>״̬ת<CCAC><D7AA> -> <20><><EFBFBD><EFBFBD>
|
||||
//2<><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD> -> ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD>
|
||||
//3<><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF>ܲ<EFBFBD><DCB2><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>Ž<EFBFBD><C5BD><EFBFBD>
|
||||
//4<><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
|
||||
int minEditDistance(const string& a, const string& b) {
|
||||
int m = a.size(), n = b.size();
|
||||
// dp[i][j]<5D><>ʾA[0:i]<5D><>B[0:j]<5D><><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
|
||||
|
||||
// <20><>ʼ<EFBFBD><CABC><EFBFBD>߽<EFBFBD>
|
||||
for (int i = 0; i <= m; ++i) dp[i][0] = i; // ɾ<><C9BE>i<EFBFBD><69><EFBFBD>ַ<EFBFBD>
|
||||
for (int j = 0; j <= n; ++j) dp[0][j] = j; // <20><><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD>ַ<EFBFBD>
|
||||
|
||||
// ״̬ת<CCAC><D7AA>
|
||||
for (int i = 1; i <= m; ++i) {
|
||||
for (int j = 1; j <= n; ++j) {
|
||||
if (a[i-1] == b[j-1]) {
|
||||
dp[i][j] = dp[i-1][j-1]; // ƥ<>䣬<EFBFBD><E4A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
} else {
|
||||
dp[i][j] = min({dp[i-1][j-1], dp[i-1][j], dp[i][j-1]}) + 1; // <20>滻<EFBFBD><E6BBBB>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return dp[m][n];
|
||||
}
|
||||
|
||||
int main() {
|
||||
string a, b;
|
||||
getline(cin, a); // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>A
|
||||
getline(cin, b); // <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>B
|
||||
cout << minEditDistance(a, b) << endl; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <algorithm>
|
||||
using namespace std;
|
||||
|
||||
int main() {
|
||||
int n, w;
|
||||
cin >> n >> w;
|
||||
vector<int> a(n);
|
||||
for (int i = 0; i < n; i++) cin >> a[i];
|
||||
|
||||
vector<int> dp(w + 1, 1e9);
|
||||
dp[0] = 0;
|
||||
|
||||
for (int j = 0; j < n; j++) {
|
||||
for (int i = a[j]; i <= w; i++) {
|
||||
dp[i] = min(dp[i], dp[i - a[j]] + 1);
|
||||
}
|
||||
}
|
||||
|
||||
if (dp[w] == 1e9) cout << -1 << endl; // <20><EFBFBD>
|
||||
else cout << dp[w] << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
35
Algorithm/DP-DynamicProgramming/Linear-DP/P1164 小A点菜.cpp
Normal file
35
Algorithm/DP-DynamicProgramming/Linear-DP/P1164 小A点菜.cpp
Normal file
@@ -0,0 +1,35 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <unordered_map>
|
||||
using namespace std;
|
||||
int main(){
|
||||
int n, m;
|
||||
cin >> n >> m;
|
||||
vector<int> arr(n);
|
||||
vector<int> dp(m + 1, 0);
|
||||
unordered_map<int, int> mp;
|
||||
for(int i = 0; i < n; i++){
|
||||
cin >> arr[i];
|
||||
mp[i]++;
|
||||
}
|
||||
dp[0] = 1;
|
||||
//dp[i] += dp[i - arr[j]]
|
||||
|
||||
/* 0/1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j<EFBFBD><6A><EFBFBD><EFBFBD><EFBFBD>㣬<EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>d[i]
|
||||
for(int i = 1; i <= m; i++){
|
||||
for(int j = 0; j < n; j++){
|
||||
if(i - arr[j] >= 0) {
|
||||
dp[i] += dp[i - arr[j]];
|
||||
}
|
||||
}
|
||||
}*/
|
||||
//<2F><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA>
|
||||
for(int j = 0; j < n; j++){
|
||||
for(int i = m; i >= arr[j]; i--){
|
||||
dp[i] += dp[i - arr[j]];
|
||||
}
|
||||
}
|
||||
|
||||
cout << dp[m] << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
int main(){
|
||||
int n;
|
||||
cin >> n;
|
||||
vector<vector<int>> arr(n);
|
||||
vector<vector<int>> dp(n);
|
||||
int tmp;
|
||||
for(int i = 0; i < n; i++){
|
||||
for(int j = 0; j < i + 1; j++){
|
||||
cin >> tmp;
|
||||
arr[i].push_back(tmp);
|
||||
dp[i].push_back(-1);
|
||||
}
|
||||
}
|
||||
dp[0][0] = arr[0][0];
|
||||
for(int i = 1; i < n; i++){
|
||||
for(int j = 0; j < i + 1; j++){
|
||||
if(j == 0) dp[i][j] = dp[i - 1][j] + arr[i][j];
|
||||
else if(j == i) dp[i][j] = dp[i - 1][j - 1] + arr[i][j];
|
||||
else{
|
||||
dp[i][j] = max(dp[i - 1][j - 1] + arr[i][j], dp[i - 1][j] + arr[i][j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
int max = -2;
|
||||
for(int i = 0; i < n; i++){
|
||||
if(dp[n - 1][i] > max) max = dp[n - 1][i];
|
||||
}
|
||||
cout << max << endl;
|
||||
return 0;
|
||||
}
|
||||
28
Algorithm/DP-DynamicProgramming/Linear-DP/P1439.cpp
Normal file
28
Algorithm/DP-DynamicProgramming/Linear-DP/P1439.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
int main(){
|
||||
int n;
|
||||
cin >> n;
|
||||
vector<int> a(n), b(n);
|
||||
for(int i = 0; i < n; i++){
|
||||
cin >> a[i];
|
||||
}
|
||||
for(int i = 0; i < n; i++){
|
||||
cin >> b[i];
|
||||
}
|
||||
int a_size = a.size(), b_size = b.size();
|
||||
vector<vector<int>> dp(a.size() + 1, vector<int>(b_size + 1, 0));
|
||||
for(int i = 1; i <= a_size; i++){
|
||||
for(int j = 1; j <= b_size; 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]);
|
||||
}
|
||||
}
|
||||
}
|
||||
cout << dp[a_size][b_size] << endl;
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
int main(){
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#include <iostream>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
double dist(const pair<int, int>& x, const pair<int, int>& y){
|
||||
double r = sqrt( (y.first - x.first) * (y.first - x.first) + (y.second - x.second) * (y.second - x.second) );
|
||||
return r;
|
||||
}
|
||||
|
||||
int main(){
|
||||
int n;
|
||||
cin >> n;
|
||||
vector<pair<int, int>> m(n);
|
||||
for(int i = 0; i < n; i++){
|
||||
cin >> m[i].first >> m[i].second;
|
||||
}
|
||||
vector<vector<int>> dp(n, vector<int>(n, 0));
|
||||
int k = 0;
|
||||
//dp[0][0] = 0;
|
||||
int i = 0, j = 0;
|
||||
while(dp[n - 1][n - 1] == 0){
|
||||
k = max(i, j) + 1;
|
||||
dp[i][k] = min(d[i][k], d[i][j] + dist(m[k], m[j]));
|
||||
dp[k][j] = min(d[k][j], d[i][j] + dist(m[k], m[i]));
|
||||
i++;j++;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user