uva 10201 Adventures in Moving - Part IV

题意:有t组测试数据,每组数据的开始表示终点的位置,然后接下来有若干对数x,y,x表示沿途的加油的位置,y表示每升油的价格。每组数据间有一个空行。开始的时候在位置0,油箱里有100升汽油,问最后到达终点,且油箱里还有100升汽油所需的最小花费是多少。

在做这题时候,有两个误区,WA了很多次,一是错认为终点一定在加油站上,二是认为给我们的加油站的位置不会超过终点。但实际上是会超过的,也就是说我们判断这组测试数据结束只能通过最后的那个空行。


#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define INF 1<<30
const int N=305;
int n,m,map[N][N*2];
bool vis[N][N*2];
struct node
{
    int x,y;
    void fun(int a,int b){x=a;y=b;}
}gas[N];
int dp(int,int);
int main()
{
    //freopen("in.txt","r",stdin);
    int t,t_cnt=0;
    scanf("%d",&t);
    while(t--)
    {
        n=1;
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        memset(gas,0,sizeof(gas));
        char str[100];
        scanf("%d",&m);
        getchar();
        while(gets(str))
        {
            if(strlen(str)) {sscanf(str,"%d%d",&gas[n].x,&gas[n].y);n++;}
            else break;
        }
        int temp=dp(0,100);
        if(t_cnt++!=0) puts("");
        if(temp!=INF) printf("%d\n",dp(0,100));
        else puts("Impossible");
    }
    return 0;
}
int dp(int x,int y)
{
    bool &flag=vis[x][y];
    int &res=map[x][y];
    if(flag) return res;
    else if(m-gas[x].x<=y-100)
    {
        flag=1;res=0;
        return res;
    }
    else
    {
        res=INF;
        for(int i=x+1;i<n;i++)
        {
            int remain=y-(gas[i].x-gas[x].x);
            if(remain>=0)
            {
                for(int j=0;j+remain<=200;j++)
                {
                    int temp=dp(i,j+remain);
                    if(temp!=INF) res=min(res,temp+j*gas[i].y);
                }
            }
            else break;
        }
        flag=1;return res;
    }
}


你可能感兴趣的:(uva 10201 Adventures in Moving - Part IV)