1 条题解
-
0
考验对条件的刻画吧,这种题 zfr 估计随便秒。
考虑刻画一个人集邮的路线,其必然是形如:
- 先造出来一条从 的上行路线。
- 每次添加一个环 ,表示其在 处转移到了下行路线,然后在 处再转移回来,后文记所有 的可重集为 ,所有 的可重集为 。
- 对于路上的每个 ,其会向距离最近的一个位置进行连边,这样才能收集到 。
然后你发现答案只和 有关,对于一对 可行的充要条件,考虑 的构造是两两匹配的形式,显然就是每一段前缀 的个数都大于等于 。
那么 DP 状态里面只需要记 即可,状态就是 表示到第 位,当前 ,显然 ,随便转移一下,时间复杂度是 的。
::::info[code]
const int N=3e3+5; int n,l; int f[N][N]; int u[N],v[N],d[N],e[N]; int main(){ n=read(),l=read(); for(int i=1;i<=n;i++)u[i]=read(),v[i]=read(),d[i]=read(),e[i]=read(); memset(f,0x3f,sizeof f); f[0][0]=(n+1)*l; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) chkmin(f[i][j],f[i-1][j-1]+d[i]+v[i]); for(int j=0;j< n;j++) chkmin(f[i][j],f[i-1][j+1]+e[i]+u[i]); for(int j=1;j<=n;j++) chkmin(f[i][j],f[i][j-1]+d[i]+v[i]); for(int j=n-1;j;j--) chkmin(f[i][j],f[i][j+1]+e[i]+u[i]); for(int j=0;j<=n;j++) chkmin(f[i][j],f[i-1][j]+u[i]+v[i]); for(int j=1;j<=n;j++) chkmin(f[i][j],f[i-1][j]+d[i]+e[i]); for(int j=1;j<=n;j++) f[i][j]+=2*l*j; } printf("%d\n",f[n][0]); }::::
- 1
信息
- ID
- 5909
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者