题解:P1545 [USACO04DEC] Dividing the Path G

· · 题解

本题是一道 DP 题。

用 f_{i,j,k} 表示 fj 用前 i 头牛,fp 用前 j 头牛中各选出 k 头牛来比拼时 fj 胜利的情况个数。

转移方程为:

f_{i,j,k}=f_{i-1,j,k}+f_{i,j-1,k}-f_{i-1,j-1,k} f_{i,j,k} \gets f_{i-1,j-1,k-1}(a_i>b_j)

答案是 f_{n,m,k} 。值得注意的是,取模需要保证不为负数,因此与多加一个 mod。

code:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,INF=2e9+10;
int n,l,a,b;
int dp[N];
bool v[N];
int main()
{
    cin>>n>>l>>a>>b;
    for(int i=1;i<=n;i++)
    {
        int s,e;
        cin>>s>>e;
        for(int j=s+1;j<=e-1;j++)v[j]=1;    
    }
    for(int i=1;i<=l;i++)dp[i]=INF;
    dp[0]=1;
    for(int i=2;i<=l;i+=2)
    {
        for(int j=i-2*b;j<=i-2*a;j+=2)
        {
            if(j<0 || v[j])continue;
            dp[i]=min(dp[i]-1,dp[j])+1;
        }
    }
    if(dp[l]>=INF)cout<<-1;
    else cout<<dp[l]-1;
}