Skip to main content
Original364 words2 min

题解:P13513 [KOI 2025 #1] 釜山观光

Summary

两人在釜山停留 n 天,两个 01 串给出各自日程,某人某天为 1 则当天必须持有有效票券。可购买单人 1 日、3 日、5 日票和双人 4 日票,求覆盖所有需求的最小费用。做法是二维 DP,设 f 表示第一人前 i 天、第二人前 j 天都满足覆盖的最小费用,转移分别覆盖某一人,或在对角线上用双人票同时覆盖两人。时间复杂度 O(n^2)。

题意简述​

Hankook 和 Jeong-ul 两人将在釜山停留 nn 天,给定两个 01\texttt{01} 字符串 a,ba,b 表示各自日程。

若某人某天对应的日程字符为 1\texttt{1},则该人当天必须拥有至少一张有效票券。

可购买以下 44 种票券,求所需的最小费用:

  • 单人 11 日票,价格 p1p_1;
  • 单人 33 日票,价格 p3p_3;
  • 单人 55 日票,价格 p5p_5;
  • 双人 44 日票,价格 ppairp_\text{pair}。

解题思路​

考虑使用 DP 解决:设 fi,jf_{i,j} 表示 Hankook 前 ii 天和 Jeong-ul 前 jj 天都满足覆盖的最小费用。

边界情况 f0,0=0f_{0,0}=0。

枚举 fi,jf_{i,j},考虑三种情况的最小值:

  1. 覆盖 Hankook:min⁡{ fi−1,j+[ai=1]p1,fi−3,j+p3,fi−5,j+p5 }\min\set{f_{i-1,j}+[a_i=\texttt{1}]p_1,f_{i-3,j}+p_3,f_{i-5,j}+p_5};
  2. 覆盖 Jeong-ul:min⁡{ fi,j−1+[bj=1]p1,fi,j−3+p3,fi,j−5+p5 }\min\set{f_{i,j-1}+[b_j=\texttt{1}]p_1,f_{i,j-3}+p_3,f_{i,j-5}+p_5};
  3. 同时覆盖两人(i=ji=j):fi−4,j−4+ppairf_{i-4,j-4}+p_\text{pair}。

时间复杂度为 O(n2)O(n^2)。

参考代码​

636 Bcpp
#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;
}