This commit is contained in:
Zengtudor 2025-08-27 16:51:18 +08:00
parent c200843ae3
commit f8994b5c7c
4 changed files with 166 additions and 1 deletions

View File

@ -3,4 +3,8 @@
dp[i][j]=i个到第j个涂成指定颜色需要的次数
*/
*/
int main(){
}

32
src/8/27/P1880.cpp Normal file
View File

@ -0,0 +1,32 @@
/*
*/
#include <cstdint>
#include <iostream>
#include <stdexcept>
#include <vector>
using ll = int64_t;
int main(){
ll n;
std::cin>>n;
std::vector<ll> arr(n*2+1);
std::vector<ll> pre(n*2+1);
for(ll i=1;i<=n;i++){
std::cin>>arr[i];
arr[n+i]=arr[i];
}
for(ll i=1;i<=2*n;i++){
pre[i]=pre[i-1]+arr[i];
}
std::vector<std::vector<ll>> dp;
for(ll i=1;i<n;i++){
ll j=i+n-1;
dp.clear();
dp.resize(2*n+1,std::vector<ll>(2*n+1,1e9));
// for(ll x=1;)
throw std::runtime_error("NotImpletmented");
}
}

48
src/8/27/opj1808.cpp Normal file
View File

@ -0,0 +1,48 @@
/*
dp[i][j]=A到第i位与字符串B到第j位的最长公共子序列长度
if a[i]==b[j]:
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=max(
dp[i-1][j],
dp[i][j-1]
)
*/
#include <algorithm>
#include <iostream>
#include <istream>
#include <string>
#include <vector>
using ll = int64_t;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::string a,b;
std::vector<std::vector<ll>> dp;
while (std::cin>>a>>b) {
ll n=a.size(),m=b.size();
a=' '+a;
b=' '+b;
dp.clear();
dp.resize(n+1,std::vector<ll>(m+1));
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(a[i]==b[j]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=std::max(
dp[i-1][j],
dp[i][j-1]
);
}
}
}
std::cout<<dp[n][m]<<"\n";
}
}

81
src/8/27/opj2000.cpp Normal file
View File

@ -0,0 +1,81 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <ostream>
#include <tuple>
#include <vector>
/*
dp[i][j]=A前i个与字符串B前j个
5
1 4 2 5 -12
4
-12 1 2 4
*/
using ll = int64_t;
#define gdp(i,j,k)(std::get<k>(dp[i][j]))
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
ll n,m;
std::cin>>n;
std::vector<ll> a(n+1);
for(ll i=1;i<=n;i++)std::cin>>a[i];
std::cin>>m;
std::vector<ll> b(m+1);
for(ll j=1;j<=m;j++)std::cin>>b[j];
std::vector<std::vector<std::tuple<ll,ll,ll>>>dp(n+1,std::vector<std::tuple<ll,ll,ll>>(m+1));
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
if(a[i]!=b[j]){
gdp(i, j, 0) = gdp(i-1,j,0);
gdp(i, j, 1)=i-1;
gdp(i, j, 2)=j;
}else{
ll maxprev=0;
for(ll k=1;k<j;k++){
if(b[k]<a[i]){
maxprev=std::max(maxprev,gdp(i-1,k,0));
gdp(i,j,1)=i-1;
gdp(i,j,2)=k;
}
}
gdp(i,j,0)=maxprev+1;
}
}
}
ll ans=0,maxi=0,maxj=0;
for(ll i=1;i<=n;i++){
for(ll j=1;j<=m;j++){
// printf("dp[%lld][%lld]=%lld\n",i,j,dp[i][j]);
if(ans<gdp(i,j,0)){
ans=gdp(i,j,0);
maxi=i;
maxj=j;
}
}
}
std::vector<ll> ans2;
ans2.reserve(n);
// printf("maxi=%lld,maxj=%lld\n",maxi,maxj);
while(maxi>0){
ans2.push_back(a[maxi]);
ll tmpi=maxi;
maxi=gdp(maxi,maxj,1);
maxj=gdp(tmpi,maxj,2);
}
std::cout<<ans<<"\n";
std::reverse(ans2.begin(),ans2.end());
for(auto i:ans2){
std::cout<<i<<" ";
}
std::cout<<std::endl;
_Exit(0);
}