Codeforces(E。スケジュール)DPスリーピング

タイトルはDPのときEは、ゲームを知っています。しかし、それをしませんでした。
すべてのDPは、最大の問題は、表現するために、アレイを設定する方法を知っていない質問を行います

DPは、[I] [j]が提供される
最大の利点を示している場合、I-j番目のスリープ期間の値
次いで
IF(J + [I]) %のH 〜R&LT Lとの間の
DP [I] [(J + [I])%のH ] = MAX(DP [I] [(J + [I])%H]、D [I-1]〜[J] + 1)
されていない場合
、DP [I] [(J + [I])%のH ] = maxの%のH(D [i]が[(J + [I])]、0、D [I - 1] [J])

コード:

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a[2005],inf=99999999;
int d[2005][2005];
void init()
{
    for(int i=0;i<2002;i++)
    {
        for(int j=0;j<2002;j++)
        {d[i][j]=-1;}
    }
}
int main()
{
    int n,h,l,r;
    cin>>n>>h>>l>>r;
    for(int i=1;i<=n;i++)
    {cin>>a[i];}
    init();//初始化f数组
    if(a[1]>=l&&a[1]<=r)
    {d[1][a[1]]=1;}
    else
    {d[1][a[1]]=0;}
    if(a[1]-1>=l&&a[1]-1<=r)
    {d[1][a[1]-1]=1;}
    else
    {d[1][a[1]-1]=0;}
    for(int i=2;i<=n;i++)
    {
        for(int j=0;j<=h;j++)
        {
            int op=a[i];
            if(d[i-1][j]!=-1)
            {
                int u=(j+op)%h;
                if(u>=l&&u<=r)
                {d[i][u]=max(d[i][u],d[i-1][j]+1);}
                else
                {d[i][u]=max(d[i][u],0);
                d[i][u]=max(d[i][u],d[i-1][j]);}
                op--;
                u=(j+op)%h;
                if(u>=l&&u<=r)
                {d[i][u]=max(d[i][u],d[i-1][j]+1);}
                else
                {d[i][u]=max(d[i][u],0);
                d[i][u]=max(d[i][u],d[i-1][j]);}
            }
        }
    }
    int maxx=-1;
    for(int j=0;j<=h;j++)
    {maxx=max(maxx,d[n][j]);}
    cout<<maxx<<endl;
    return 0;
}

公開された36元の記事 ウォンの賞賛4 ビュー1382

おすすめ

転載: blog.csdn.net/qq_43781431/article/details/104857972