[NOIP2016] 교실 바꾸기.

7442 단어 NOIPDP동적 기획
제목

문제풀이


사실 16년은 어렵지 않은 것 같아요???이 문제는 작년에 시험장에서 DP가 다 생각해 냈어요...단지 수학의 기대를 할 줄 몰라서...그리고 GG...이 문제는 수학의 기대를 충족시키기만 하면 된다. f[i][j][0/1]를 설정하면 앞의 i과목 중 j과목이 바뀌었다는 것을 나타낸다. 지난 과목이 교실을 바꿨는지 기대를 바꾸면 된다...
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX 2010
#define INF 1000000000
int c[MAX],d[MAX];
double K[MAX];
int g[350][350];
double f[MAX][MAX][2];
double s[MAX][MAX][2];
int n,m,v,E;
int main()
{
    scanf("%d%d%d%d",&n,&m,&v,&E);
    for(int i=1;i<=n;++i)scanf("%d",&c[i]);
    for(int i=1;i<=n;++i)scanf("%d",&d[i]);
    for(int i=1;i<=n;++i)scanf("%lf",&K[i]);
    for(int i=1;i<=v;++i)
        for(int j=1;j<=v;++j)
            if(i!=j)g[i][j]=INF;
    for(int i=1;i<=E;++i)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        g[u][v]=g[v][u]=min(g[u][v],w);
    }
    for(int k=1;k<=v;++k)
        for(int i=1;i<=v;++i)
            for(int j=1;j<=v;++j)
                g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
    //f[i][j][0/1]   i    ,  j ,         
    for(int i=1;i<=n;++i)
        for(int j=0;j<=m;++j)
            f[i][j][0]=f[i][j][1]=INF;
    f[1][0][0]=f[1][1][1]=0.0;
    for(int i=2;i<=n;++i)
    {
        f[i][0][0]=f[i-1][0][0]+g[c[i-1]][c[i]]*1.0;
        for(int j=1;j<=m;++j)
        {
            f[i][j][0]=f[i-1][j][0]+1.0*g[c[i-1]][c[i]];
            f[i][j][0]=min(f[i][j][0],f[i-1][j][1]+1.0*K[i-1]*g[d[i-1]][c[i]]+1.0*(1.0-K[i-1])*g[c[i-1]][c[i]]);
            double t2;
            f[i][j][1]=f[i-1][j-1][0]+1.0*K[i]*g[c[i-1]][d[i]]+1.0*(1.0-K[i])*g[c[i-1]][c[i]];
            t2=f[i-1][j-1][1];
            t2+=K[i]*(1.0*K[i-1]*g[d[i-1]][d[i]]+1.0*(1.0-K[i-1])*g[c[i-1]][d[i]]);
            t2+=(1.0-K[i])*(1.0*K[i-1]*g[d[i-1]][c[i]]+1.0*(1.0-K[i-1])*g[c[i-1]][c[i]]);            
            f[i][j][1]=min(f[i][j][1],t2);
        }
    }
    double ans=f[n][0][0];
    for(int i=1;i<=m;++i)ans=min(f[n][i][0],ans),ans=min(f[n][i][1],ans);
    printf("%.2lf
"
,ans); return 0; }

좋은 웹페이지 즐겨찾기