zoukankan      html  css  js  c++  java
  • [loj3339]美食家

    令$f[i][j]$表示第$i$个时刻走到点$j$的最小时间,暴力的$dp$复杂度为$o(tm)$
    如果没有限制,由于$wle 5$,记录前5个时刻的状态即可求出当前状态,用矩阵乘法可优化到$o(n^{3}log_{2}T)$
    当$kle 10$时,考虑特殊的转移只有10个位置,对于其他位置矩乘转移,这些位置特殊考虑,复杂度$o(n^{3}klog_{2}T)$
    用倍增预处理出矩阵的$2^{i}$次幂,直接用答案进行运算使一次乘法降为$o(n^{2})$,总复杂度即$o((n+k)n^2log_{2}T)
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define ll long long
     4 #define oo 1e15
     5 struct mat{
     6     ll a[305][305];
     7 }a,o,aa,mi[31];
     8 struct fe{
     9     int t,k,w;
    10 }b[205];
    11 int n,m,t,k,x,y,z,flag,w[105];
    12 ll s[305],ans[305];
    13 bool cmp(fe x,fe y){
    14     return x.t<y.t;
    15 }
    16 mat mul(mat &x,mat &y){
    17     for(int i=1;i<=5*n;i++)
    18         for(int j=1;j<=5*n;j++){
    19             o.a[i][j]=-oo;
    20             for(int k=1;k<=5*n;k++)o.a[i][j]=max(o.a[i][j],x.a[i][k]+y.a[k][j]);
    21         }
    22     return o;
    23 }
    24 void mul(mat &x){
    25     memcpy(s,ans,sizeof(s));
    26     for(int i=1;i<=5*n;i++){
    27         ans[i]=-oo;
    28         for(int j=1;j<=5*n;j++)ans[i]=max(ans[i],s[j]+x.a[j][i]);
    29     }
    30 }
    31 void pow(int n){
    32     for(int i=0;i<=30;i++)
    33         if (n&(1<<i))mul(mi[i]);
    34 }
    35 int main(){
    36     freopen("delicacy.in","r",stdin);
    37     freopen("delicacy.out","w",stdout);
    38     scanf("%d%d%d%d",&n,&m,&t,&k);
    39     for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    40     for(int i=1;i<=5*n;i++)
    41         for(int j=1;j<=5*n;j++)a.a[i][j]=-oo;
    42     for(int i=1;i<=m;i++){
    43         scanf("%d%d%d",&x,&y,&z);
    44         a.a[(5-z)*n+x][4*n+y]=w[y];
    45     }
    46     for(int i=n+1;i<=5*n;i++)a.a[i][i-n]=0;
    47     aa=a;
    48     for(int i=1;i<=k;i++)scanf("%d%d%d",&b[i].t,&b[i].k,&b[i].w);
    49     sort(b+1,b+k+1,cmp);
    50     mi[0]=a;
    51     for(int i=1;i<=30;i++)mi[i]=mul(mi[i-1],mi[i-1]);
    52     for(int i=1;i<=5*n;i++)ans[i]=-oo;
    53     ans[4*n+1]=0;
    54     for(int i=1;i<=k;i++){
    55         pow(b[i].t-b[i-1].t-1);
    56         a=mi[0];
    57         for(int j=1;j<=5*n;j++)a.a[j][4*n+b[i].k]+=b[i].w;
    58         mul(a);
    59     }
    60     pow(t-b[k].t);
    61     if (ans[4*n+1]<0)printf("-1
    ");
    62     else printf("%lld",ans[4*n+1]+w[1]);
    63     return 0;
    64 }
    View Code
  • 相关阅读:
    网上零售是国内品牌开拓海外市场的最佳途径
    一个都不能少,海外B2C实战攻略全解
    我想和你一起浅浅淡淡的生活
    中国十大电子商务网站排名
    外贸B2C必读:外贸B2C入行指南(一)
    外贸B2C必读:外贸B2C入行指南(二)
    09年美国最热门的100个B2C网站,他们是怎么成功的?
    几个jsp模块
    【Quartz】【程序目录结构】/DetectNonWorkingDay/src/main/java/com/apple/sqm/dnwd/detect/delta/Detect.java
    Servlet 工作原理解析
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/13532181.html
Copyright © 2011-2022 走看看