题意:修长城n个损坏点,每个损坏点在时刻t被修,那么费用就是ci+t*di,问修完每个损坏点的最小费用。
状态很好想,因为是一条直线,所以dp[i][j][k]代表区间i到j维修完停在左或右(k对应0和1)的最小费用,其他没有维修的d费用也一起累加进来,这样就不用管时间了。递推的话分2种情况,往左走和往右走。
但是递推的方向是个问题,记忆化搜索肯定可以。假设机器人原来的位置在x处,那么第一维应该是从x->0,第二维应该是x->n,因为我们很容易可以发觉DP递推是从中间往外扩张的。
AC代码:
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<ctype.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<cstdlib>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<ctime>
#include<str