uva-1025

来源:互联网 发布:js href click 编辑:程序博客网 时间:2024/06/11 02:04

2017.12.4.---萌新刷dp第一夜

紫书第一道例题。我只想说mmp,根本想不到这么做。

今晚先写下今晚的感想,以后这题悟透了再继续添加。

大体思路就是,你在这一个时刻i可以继续等一分钟,也可以坐上向右或者向左的火车。目标是求最少的等待时间,那么我们就储存等待时间。

#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>#include <set>#include <stack>#include <string>#include <cmath>#include <map>#include <queue>#include <vector>using namespace std;const int maxn=250;const int INF=1e8;int n,T,k;int d[maxn];int l,r;int dp[maxn][maxn],train[maxn][maxn][4];int lt[maxn],rt[maxn];int main(){    while(scanf("%d",&n) && n)    {        scanf("%d",&T);        memset(d,0,sizeof(d));        for(int i=1;i<=n-1;i++) scanf("%d",&d[i]);        scanf("%d",&l);        memset(lt,0,sizeof(lt));        for(int i=0;i<l;i++) scanf("%d",<[i]);        scanf("%d",&r);        memset(rt,0,sizeof(rt));        for(int i=0;i<r;i++) scanf("%d",&rt[i]);        memset(dp,0,sizeof(dp));        for(int i=1;i<=n-1;i++) dp[T][i]=INF;        dp[T][n]=0;        memset(train,0,sizeof(train));        for(int i=0;i<l;i++)//求出向右的火车在每个车站的时刻        {            int val=0;            for(int j=1;j<=n;j++)            {                train[lt[i]+val][j][0]=1;                val+=d[j];            }        }        for(int i=0;i<r;i++)//求出向左的火车在每个车站的时刻        {            int val=0;            for(int j=n;j>0;j--)            {                train[rt[i]+val][j][1]=1;                val+=d[j-1];            }        }        for(int i=T-1;i>=0;i--)        {            for(int j=1;j<=n;j++)            {                dp[i][j]=dp[i+1][j]+1;//先求出等待时间                if(j<n && train[i][j][0] && i+d[j]<=T)//比较等待更优还是上向右的火车更优                    dp[i][j]=min(dp[i][j],dp[i+d[j]][j+1]);                if(j>1 && train[i][j][1] && i+d[j-1]<=T)//比较等待更优还是上向左的火车更优                    dp[i][j]=min(dp[i][j],dp[i+d[j-1]][j-1]);            }        }        printf("Case Number %d: ",++k);        if(dp[0][1]>=INF) printf("impossible\n");        else printf("%d\n",dp[0][1]);    }    return 0;}


原创粉丝点击