CH5102 Mobile Service

mac2025-08-08  9

https://ac.nowcoder.com/acm/contest/1041/D

这题的关键在于对于第i步来说,一定是有一个点在p[i]的,所以这一维可以优化掉

而对于优化掉一维的这种DP来说,由i推向i+1更加简单,由i-1转移到i不好转移。。。。

 

#include<bits/stdc++.h> #define maxl 1010 using namespace std; int L,n,ans; int a[maxl],p[maxl]; int c[210][210]; int f[maxl][210][210]; inline void prework() { scanf("%d%d",&L,&n); for(int i=1;i<=L;i++) for(int j=1;j<=L;j++) scanf("%d",&c[i][j]); for(int i=1;i<=n;i++) scanf("%d",&p[i]); } inline void upd(int &x,int y) { if(y<x) x=y; } inline void mainwork() { for(int t=0;t<=n;t++) for(int i=1;i<=L;i++) for(int j=1;j<=L;j++) f[t][i][j]=2e9; f[0][1][2]=0;p[0]=3; for(int i=0;i<=n-1;i++) for(int x=1;x<=L;x++) for(int y=1;y<=L;y++) if(x!=y && x!=p[i] && y!=p[i]) { if(x!=p[i+1] && y!=p[i+1]) upd(f[i+1][x][y],f[i][x][y]+c[p[i]][p[i+1]]); if(p[i]!=p[i+1] && y!=p[i+1]) upd(f[i+1][p[i]][y],f[i][x][y]+c[x][p[i+1]]); if(p[i]!=p[i+1] && x!=p[i+1]) upd(f[i+1][x][p[i]],f[i][x][y]+c[y][p[i+1]]); } ans=2e9; for(int x=1;x<=L;x++) for(int y=1;y<=L;y++) ans=min(ans,f[n][x][y]); } inline void print() { printf("%d",ans); } int main() { prework(); mainwork(); print(); return 0; }

 

最新回复(0)