zoukankan      html  css  js  c++  java
  • [TYVJ1061] Mobile Service|动态规划|滚动数组

    P1061 Mobile Service
    时间: 1000ms / 空间: 131072KiB / Java类名: Main

    描述

    一个公司有三个移动服务员。如果某个地方有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q)。这个函数没有必要对称,但是c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。

    输入格式

    第一行有两个整数L,N(3<=L<=200, 1<=N<=1000)。L是位置数;N是请求数。每个位置从1到L编号。下L行每行包含L个非负整数。第i+1行的第j个数表示c(i,j) ,并且它小于2000。最后一行包含N个数,是请求列表。一开始三个服务员分别在位置1,2,3。

    输出格式

    一个数M,表示最小服务花费。

    测试样例1

    输入

    5 9 
    0 1 1 1 1 
    1 0 2 3 2 
    1 1 0 4 1 
    2 1 5 0 1 
    4 2 3 4 0 
    4 2 4 1 5 4 3 2 1

    输出

    5
     
     
    先orz@ws_colin大爷
     
    f[l][i][j][k]表示进行到第l个任务,一个人在i,一个人在j,一个人在k。
    由于f[l][][][]只与f[l-1][][][]有关,第一维可以滚动一下~
    然而还是有点大会TLE啊T T
    ---------------------------------以下膜拜ws_colin大爷-------------------------------
    由于每个任务都要满足,可以压掉一维再改一下转移就好了。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #define inf 1000000000
    using namespace std;
    int l,n,x,r,ans,a[205][205],f[2][205][205],t[1005];
    inline int read()
    {
        int a=0,f=1; char c=getchar();
        while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}
        while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}
        return a*f;
    }
    int main()
    {
        l=read(); n=read();
        for (int i=1;i<=l;i++)
            for (int j=1;j<=l;j++)
                a[i][j]=read();
        for (int i=1;i<=n;i++) t[i]=read();
        ans=inf;
        for (int i=1;i<=l;i++)
            for (int j=1;j<=l;j++)
                f[r][i][j]=inf;
        f[r][1][3]=a[2][t[1]];
        f[r][2][3]=a[1][t[1]];
        f[r][1][2]=a[3][t[1]];
        for (int k=1;k<n;k++)
        {
            r^=1;
            for (int i=1;i<=l;i++)
                for (int j=1;j<=l;j++)
                    f[r][i][j]=inf;
            for (int i=1;i<=l;i++)
                for (int j=1;j<=l;j++)
                {
                    f[r][j][t[k]]=min(f[r][j][t[k]],f[r^1][i][j]+a[i][t[k+1]]);
                    f[r][i][t[k]]=min(f[r][i][t[k]],f[r^1][i][j]+a[j][t[k+1]]);
                    f[r][i][j]=min(f[r][i][j],f[r^1][i][j]+a[t[k]][t[k+1]]);
                }
        }
        for (int i=1;i<=l;i++)
            for (int j=1;j<=l;j++)
                ans=min(ans,f[r][i][j]);
        printf("%d",ans);
        return 0;
    }
  • 相关阅读:
    2021NUAA暑假集训 Day3 题解
    2021NUAA暑假集训 Day2 题解
    2021NUAA暑期模拟赛部分题解
    CodeForces 1038D Slime
    UVA 11149 Power of Matrix
    UVA 10655 Contemplation! Algebra
    UVA 10689 Yet another Number Sequence
    HDU 4549 M斐波那契数列
    HDU 4990 Reading comprehension
    CodeForces 450B Jzzhu and Sequences
  • 原文地址:https://www.cnblogs.com/ws-fqk/p/4762797.html
Copyright © 2011-2022 走看看