P13513 [KOI 2025 #1] 釜山观光
· 2 min read
题意简述
Hankook 和 Jeong-ul 两人将在釜山停留 天,给定两个 字符串 表示各自日程。
若某人某天对应的日程字符为 ,则该人当天必须拥有至少一张有效票券。
可购买以下 种票券,求所需的最小费用:
- 单人 日票,价格 ;
- 单人 日票,价格 ;
- 单人 日票,价格 ;
- 双人 日票,价格 。
解题思路
考虑使用 DP 解决:设 表示 Hankook 前 天和 Jeong-ul 前 天都满足覆盖的最小费用。
边界情况 。
枚举 ,考虑三种情况的最小值:
- 覆盖 Hankook:;
- 覆盖 Jeong-ul:;
- 同时覆盖两人():。
时间复杂度为 。
参考代码
#include <bits/stdc++.h>
using namespace std;
const int N=2005;
int f[N][N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n,p1,p3,p5,pr;
string a,b;
cin>>n>>a>>b>>p1>>p3>>p5>>pr;
memset(f,0x3f,sizeof f);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==0&&j==0){f[i][j]=0;continue;}
if(i>0)f[i][j]=min(f[i][j],min({f[i-1][j]+(a[i-1]-'0')*p1,f[max(i-3,0)][j]+p3,f[max(i-5,0)][j]+p5}));
if(j>0)f[i][j]=min(f[i][j],min({f[i][j-1]+(b[j-1]-'0')*p1,f[i][max(j-3,0)]+p3,f[i][max(j-5,0)]+p5}));
if(i==j)f[i][j]=min(f[i][j],f[max(i-4,0)][max(j-4,0)]+pr);
}
}
cout<<f[n][n]<<'\n';
return 0;
}