[CSP-キャンパストレーニング]ホテル

問題の意味

n個のお部屋はそれぞれあります(a_iを\)\個人\((a_iを\のLeq。7)\) このようなオペレーティング人を動かすことで持つことができるという部屋\(0、4 \)支出における個人人の単価グリッド移動、解無し出力-1

サンプル入力
。7
。1 0 0 0 0 7 3

サンプル出力
6

考え

DPは直接従事、使用することであると考えるようになりました\(dp_ {I、Jを} \) 記録する前に(私は\)\を余分な部屋が合法的である場合に\(j個\)個人的に、しかし、そうするために\(がJ \)がよいです我々は上昇し続けます

こうしてで\(dp_ {I、J} \) から表す\(Iは\)部屋に\は、(i + 1 \)に移動\(J \)最初ように個体を\(Iは\)部屋が会います最小コスト条件

(すなわち、負の電位が、i番目の人は、転写層を列挙し、得られた上層を通って部屋に来ることができ、この層であることができる\(I + 1 \)をする(iは\)\運動)、規格番号を追加する必要があります(ここでは、プラス7)

コード

#include<bits/stdc++.h>
#define N 100005
#define Min(x,y) ((x)<(y)?(x):(y))
using namespace std;
typedef long long ll;
const ll inf = 10000000000000000;
int n,a[N];
ll f[N][15];

template <class T>
void read(T &x)
{
    char c;int sign=1;
    while((c=getchar())>'9'||c<'0') if(c=='-') sign=-1; x=c-48;
    while((c=getchar())>='0'&&c<='9') x=x*10+c-48; x*=sign;
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    read(n);
    for(int i=1;i<=n;++i) read(a[i]);
    for(int i=0;i<=n;++i)
      for(int j=0;j<=14;++j)
        f[i][j]=inf;
    
    f[0][7]=0;
    for(int i=1;i<=n;++i)
      for(int j=0;j<=14;++j)//now
        for(int k=0;k<=14;++k)//las
        {
            int in=k-7,out=j-7;
            int res=a[i]+in-out;
            if(res==0||res==4||res==7)  
              f[i][j]=Min(f[i][j],f[i-1][k]+abs(in));
        }
    cout<<(f[n][7]==inf ? -1 : f[n][7])<<endl;
    return 0;
}

これは、どのような地獄診察室を思って、ルイDPその理由ではありません

おすすめ

転載: www.cnblogs.com/Chtholly/p/11639483.html