atc的一道套路线性dp

C - Jumping Takahashi (atcoder.jp)

题意:

高木在原点(x=0)处,可以跳n次,每次跳ai 或者bi 长

给定目标点X,问是否可以跳到点X处?

解:

考虑高木当前该跳第 i 步,目前的坐标为 j

且当前的这个状态是合法的,也就是说 dp[ i ][ j ]=true

那么下一步高木可以走的情况是:

j+a[i]<=x or  j+b[i]<=x

则下一步的状态描述为:dp[i+1][j+a[i]] or dp[i+1][j+b[i]] 为 true

终态为:dp[n][x]

void solve()
{
    int n,x;std::cin>>n>>x;
    std::vector<int>a(n),b(n);
    for(int i=0;i<n;i++)std::cin>>a[i]>>b[i];
    std::vector dp(n+1,std::vector(x+1,0));
    dp[0][0]=1;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<=x;j++)
        {
            if(dp[i][j])
            {
                if(j+a[i]<=x)dp[i+1][j+a[i]]=1;
                if(j+b[i]<=x)dp[i+1][j+b[i]]=1;
            }
        }
    }
    std::cout<<(dp[n][x]?"Yes":"No");
}

 

void solve()
{
    int n,x;std::cin>>n>>x;
    std::bitset<(int)(1e4+1e1)>f;
    f[0]=1;
    for(int i=0,a,b;i<n;i++)
    {
        std::cin>>a>>b;
        f=(f<<a)|(f<<b);
    }
    std::puts(f[x]?"Yes":"No");
}

 

posted @ 2023-02-15 16:08  惣聪术  阅读(31)  评论(0)    收藏  举报