feat: 添加P1545.cpp解决动态规划问题

实现动态规划算法解决特定区间覆盖问题,计算最小覆盖次数。使用差分数组优化区间标记,并通过双重循环计算最优解。
This commit is contained in:
Zengtudor 2025-11-18 21:36:34 +08:00
parent a43a4849c6
commit 5e1c92cd26

39
src/11/18/P1545.cpp Normal file
View File

@ -0,0 +1,39 @@
#include <algorithm>
#include <cstdint>
#include <cstdio>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
// #define printf
const ll inf=1e9+7;
ll n,l,a,b;
std::vector<ll> v,dp,diff;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>l>>a>>b;
v.resize(l+1);dp.resize(l+1,inf);diff.resize(l+2);
for(ll i=1;i<=n;i++){
ll s,e;
std::cin>>s>>e;
v[s]++,v[e]--;
diff[e]++;
}
dp[0]=0;
for(ll i=1;i<=l;i++){
v[i]+=v[i-1];
for(ll j=a;j<=b&&i-j*2>=0;j++){
if(!v[i-j*2] || diff[i-j*2]==v[i-j*2-1]){
dp[i]=std::min(dp[i],dp[i-j*2]+1);
}
}
printf("now[%lld]=%lld\n",i,v[i]);
printf("dp[%lld]=%lld\n",i,dp[i]);
printf("diff[%lld]=%lld\n",i,diff[i]);
printf("\n");
}
std::cout<<dp[l]<<"\n";
}