zoukankan      html  css  js  c++  java
  • CH5102/SPOJ?? Mobile Service/P4046 [JSOI2010]快递服务[线性dp+卡常]

    http://contest-hunter.org:83/contest/0x50%E3%80%8C%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E3%80%8D%E4%BE%8B%E9%A2%98/5102%20Mobile%20Service


    终于会做一道了。。

    $f[i][j][k]$表示第$i$个命令后一个人在$j$,另一个在$k$,还有一个在哪你懂得。(其实这里是一个状态精简,第三个人的状态没必要留,因为可以知道)

    于是每个操作枚举上一次两个人分布位置,排除一下站同一位置的,三个人里面选一个推过来。采用前推法(←我瞎起的名字2333)dp。状转的话看code里面三行好了。

    EFFECTIVE SKILLS


    很好写。但是比较卡常。一些细节优化:

    • $f[2][N][N]$滚动。基本操作,优化空间。另外,在这题里面(或者说很多题中也)可以顺便优化时间清INF的操作就可以不用了。原理是每次枚举i^1的两个人位置的时候由于这两个人位置状态枚举掉后不会再看了,而下一次再用i^1这一维的时候有要求有初始最大值方便更新,所以我现在推完立即就把i^1这一维设为INF。下次就不清INF了。时间就会极大减少。注意顺带清INF操作放在判断(line32)外面(其实是因为不想去想重叠的情况什么的了,统统初始化算了)
    • 枚举j和k时,可以缩小范围,只枚举j<k的情况,枚举数量少一半。

    然后轻松刷榜rank1。

    现在看来上面的话过于睿智,请无视。

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<queue>
     7 #define dbg(x) cerr<<#x<<" = "<<x<<endl
     8 #define ddbg(x,y) cerr<<#x<<" = "<<x<<"   "<<#y<<" = "<<y<<endl
     9 using namespace std;
    10 typedef long long ll;
    11 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;}
    12 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;}
    13 template<typename T>inline T _min(T A,T B){return A<B?A:B;}
    14 template<typename T>inline T _max(T A,T B){return A>B?A:B;}
    15 template<typename T>inline T read(T&x){
    16     x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1;
    17     while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x;
    18 }
    19 const int N=200+2,M=1000+2,INF=0x3f3f3f3f;
    20 int dis[N][N],p[M],f[2][N][N];
    21 int m,n,ans;
    22 
    23 int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
    24     read(n),read(m);
    25     for(register int i=1;i<=n;++i)for(register int j=1;j<=n;++j)read(dis[i][j]);
    26     for(register int i=1;i<=m;++i)read(p[i]);
    27     memset(f,INF,sizeof f);ans=INF;
    28     f[1][1][2]=dis[3][p[1]],f[1][1][3]=dis[2][p[1]],f[1][2][3]=dis[1][p[1]];
    29     for(register int i=2,l=0;i<=m;++i,l^=1){
    30         for(register int j=1;j<n;++j)
    31             for(register int k=j+1;k<=n;++k){
    32                 if((j^p[i-1])&&(k^p[i-1])){
    33                     MIN(f[l][j][k],f[l^1][j][k]+dis[p[i-1]][p[i]]);
    34                     p[i-1]<k?MIN(f[l][p[i-1]][k],f[l^1][j][k]+dis[j][p[i]]):MIN(f[l][k][p[i-1]],f[l^1][j][k]+dis[j][p[i]]);
    35                     p[i-1]<j?MIN(f[l][p[i-1]][j],f[l^1][j][k]+dis[k][p[i]]):MIN(f[l][j][p[i-1]],f[l^1][j][k]+dis[k][p[i]]);
    36                 }
    37                 f[l^1][j][k]=INF;
    38             }
    39     }
    40     for(register int i=1;i<=n;++i)if(i^p[m])for(register int j=i+1;j<=n;++j)if(j^p[m])MIN(ans,f[m&1][i][j]);
    41     printf("%d
    ",ans);
    42     return 0;
    43 }
  • 相关阅读:
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】Alpha
    【二食堂】团队贡献分分配规则
    【二食堂】Alpha
    【二食堂】Alpha
    Scrum Meeting 10
    Scrum Meeting 9
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/10686404.html
Copyright © 2011-2022 走看看