/* 题意: 有t组测试数据,每组数据的开始给出终点的位置,然后接下来有若干对数x,y, x表示沿途的加油的位置,y表示每升油的价格。 每组数据间有一个空行。 汽车油箱容量是200升。 汽车开始的时候在位置0,油箱里有100升汽油, 问最后到达终点,且油箱里还有100升汽油所需的最小花费是多少。
先开始没啥思路,后来问了学长又看了题解才想明白 T T 。 定义 dp[i][j]为到第 i 个加油站还剩 j 升油的最小花费。 首先有一部分状态是从第i-1个加油站得来的,即f[i][j]=f[i-1][j+d[i]-d[i-1]], 之后就是考虑第i个加油站买多少油会更划算, 那么状态转移方程为f[i][j]=min{min{f[i][k]+(j-k)*m[i]},f[i][j]} 如果终点离最后一个加油站超过100,则不可能做到还剩100升油, 因为油箱容量只有200升 。 */ #include<cstdio> #include<cstring> #include<algorithm> #define INF 0x3f3f3f3f using namespace std; char s[100]; int f[110][210],d[110],p[110]; int main() { int t,l,cnt; gets(s); sscanf(s,"%d",&t); gets(s); while(t--) { gets(s); sscanf(s,"%d",&l); cnt=0; d[0]=0; while(gets(s)!=NULL) { if(s[0] == '