JZOJ4905 BZOJ4720 [] [] []教室でのluoguP1850を変更するには

説明

ちょうど大学牡牛座のために、彼が直面した最初の質問は、実際の状況に応じて右のコースを適用する方法でした。カリキュラムに選択することができ、n個の期間に2nのカリキュラムのセクションがあります。I(1≤i≤n)期間、もちろん事前牛肉CI学校の教室内に配置された2つの異なる場所で同時に同じコンテンツ、及び教室ジ内の別のレッスンで。任意のアプリケーションの非提出の場合は、学生が順番に時間順にスケジュールされたすべてのクラスのnセクションを完了する必要があります。学生はi教室のレッスンを変更したい場合は、適用する必要があります。アプリケーションが渡された場合、生徒は教室でCIそうでない場合は、まだ、i番目の期間のクラスディに教室に行くことができます。あまりにも多くの教室を交換する必要があるため、アプリケーションは介して取得することができないかもしれません。算出することにより、牛肉は、教室のコースセクションiを交換するアプリケーションを見つけ、アプリケーションの確率は互いに独立である確率によって、KI、および各種アプリケーションプログラムのための実数で知られています。学校の規則は、すべてのアプリケーションは、唯一の学期の開始前に1時間を提出することができ、それぞれの人にのみ適用するには、m個のレッスンまで選択することができます。これは、牛肉は、特定のプログラムの結果の適用上の他のコースに適用するかどうかを決定するのではなく、各レッスン教室の1回の交換に適用するかどうかを決定しなければならないことを意味し、牛肉は教室メートルのコースを置き換えるために最善の希望を適用することができ、あなたが出て実行できません。これは、m個のアプリケーションの機会です、あなたもコースに適用することはできません。ので別のコースは違う教室で配置することができるので、クラスの牛肉の間の時間を使用する必要が別の教室に1つの教室から到着しました。教室があるV牛肉の大学では、電子の道があります。各道路は2つの教室を接続し、双方向のトラフィックをすることができます。渋滞路の長さおよび程度に応じて、変化し得る物理的強度を通る異なる経路をとります。I(1≤i≤n-1)クラスの終了後、牛肉から教室のレッスンは、物理的な教室、次の授業への最小コストのパスを選択し、開始します。牡牛座は今ので、最小コストのモバイル教室の値の和の期待値の彼の物理のために適用することができますこれらのコースのどの不思議、彼は最小値を見つけるのを助けるように頼みます。


分析

  • この種脳死もちろん、フロイトの前処理

  • 検討\(DP \) 提供([I] [J fを\ \ [0/1]) 選択された区間終了表す\(Iは\)に適用されるクラスを、\(J \) Iは、(\を\)レッスンに適用するかどうかを、最小目標値との物理的

  • ため\(F [I] [J] [0] \)、2つの状態が最小値から転送することができます

  • クラスが適用されない前、すなわち\(F [I-1] [j] [0] + DIS [C [I-1]] [C [I] \)

  • 前のレッスンアプリケーションなら、すなわち\([I-1] F [J] [1] + DIS [D [I-1]] [C [I]] * K [I-1] + DIS [C [ I-1]] [C [ I]] *(1-K [I-1])\)

  • それは、二つの期待の真ん中は何ですか、

  • 最初のレッスンのために、正常に最後に適用することが可能であることを行った(D [I-1] \)\、これは、所望のパスを追加する必要があります

  • アプリケーションは、クラスの前に失敗した場合は、まだから\(Cは[I-1] \) もまた、所望のパスを追加してきました

  • 次いでため\(F [I] [J ] [1] \) 同様に、すなわち、もしアプリケーション\(I-1 \)によって乗算されるパスのクラスの成功または失敗\(I-1 \)成功または失敗確率

  • 転送(私は\)\適用することを検討してください(私は\)\を成功または失敗の確率\(O(nm)を\)うまく転送

  • 確率と線形加算​​についても、もう少し質問をしたいと思っ


コード

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXV 305
#define MAXN 2005
#define db double
#define ll long long
#define reg register ll
#define ha 19260817
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)

using namespace std;

ll dis[MAXV][MAXV];
ll c[MAXN],d[MAXN];
db f[MAXN][MAXN][2];
db k[MAXN],ans=ha;
ll n,m,v,e;

inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
    while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline db minn(db x,db y){return x<y?x:y;}
int main()
{
    //freopen("P1850.in","r",stdin);
    //freopen("classroom.in","r",stdin);
    //freopen("classroom.out","w",stdout);
    memset(dis,1,sizeof(dis));
    n=read(),m=read(),v=read(),e=read();
    fo(i,1,n)c[i]=read();fo(i,1,n)d[i]=read();
    fo(i,1,n)scanf("%lf",&k[i]);
    fo(i,1,v)dis[i][i]=0;
    fo(i,1,e)
    {
        ll x=read(),y=read(),z=read();
        dis[x][y]=min(dis[x][y],z),dis[y][x]=min(dis[y][x],z);
    }
    fo(l,1,v)fo(i,1,v)if (i!=l)fo(j,1,v)if (i!=j && j!=l)
    dis[i][j]=min(dis[i][j],dis[i][l]+dis[l][j]);
    fo(i,0,n)fo(j,0,m)f[i][j][0]=f[i][j][1]=ha;
    f[1][0][0]=f[1][1][1]=0;
    fo(i,2,n)fo(j,0,min(i,m))
    {
        f[i][j][0]=minn(f[i-1][j][0]+dis[c[i-1]][c[i]],
        f[i-1][j][1]+dis[c[i-1]][c[i]]*(1-k[i-1])+dis[d[i-1]][c[i]]*k[i-1]);
        if (j)
        f[i][j][1]=minn(f[i-1][j-1][0]+dis[c[i-1]][d[i]]*k[i]+dis[c[i-1]][c[i]]*(1-k[i]),
        f[i-1][j-1][1]+dis[d[i-1]][d[i]]*k[i-1]*k[i]+dis[d[i-1]][c[i]]*k[i-1]*(1-k[i])+
        dis[c[i-1]][c[i]]*(1-k[i-1])*(1-k[i])+dis[c[i-1]][d[i]]*(1-k[i-1])*k[i]);
    }
    fo(i,0,m)ans=minn(ans,minn(f[n][i][0],f[n][i][1]));
    printf("%.2lf\n",ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/horizonwd/p/11565834.html