不会做DP的孩子伤不起
dp[i][j]表示到第i个站剩下油j的最小花费
油最满200
起点0 有100升
到终点是至少要留下100升
写了三个for
可以优化到2个for 没能力 以后有空在优
话说UVa的题目越做越难了 伤不起
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 210;
int dp[maxn][maxn];
int a[maxn];
int b[maxn];
int main()
{
int T, m;
scanf("%d", &T);
while(T--)
{
char str[100];
int n = 0;
a[0] = 0;
scanf("%d", &m);
getchar();
while(gets(str) && strlen(str) > 0)
{
//puts("a");
n++;
sscanf(str, "%d %d", &a[n], &b[n]);
//if(a[n] > m)
// n--;
}
//a[++n] = m;
memset(dp, 0x7f, sizeof(dp));
dp[0][100] = 0;
for(int i = 1; i <= n; i++)
{
int dis = a[i] - a[i-1];
for(int j = dis; j <= 200; j++)
{
dp[i][j-dis] = min(dp[i][j-dis], dp[i-1][j]);
int temp = j - dis;
for(int k = 0; k <= 200; k++)
{
if(temp+k > 200)
break;
dp[i][temp+k] = min(dp[i][temp+k], dp[i][temp]+k*b[i]);
}
}
}
int ans = dp[0][0];
for(int i = 0; i <= 200; i++)
if(i-(m-a[n]) >= 100)
ans = min(ans, dp[n][i]);
if(ans == dp[0][0])
puts("Impossible");
else
printf("%d\n", ans);
if(T)
printf("\n");
}
return 0;
}