2010南海初中竞赛 上学

来源:互联网 发布:php教材推荐 编辑:程序博客网 时间:2024/04/29 12:07

这里写图片描述
这里写图片描述

思路

因为这题无后效性,所以很明显可以用dp
我用了时间来划分阶段,设f[i][j] 为在i这个时间点,到达第j个城市所能达到的最小代价,则对于每一个时间点,我们可以找到一个从这个时间点出发的车,然后对到达时间之后的所有的价值进行比较(这里因为可以等待,所以要比较全部后面的),如果更优则进行替换

#include <stdio.h>using namespace std;int f[20000][60],l[50];int a[60][6];int min(int x,int y){    return x<y?x:y;}int main(){    int n,m,t;    scanf("%d%d%d",&n,&t,&m);    n--;    for (int i=1;i<=20000;i++)        for (int j=1;j<=60;j++)            f[i][j]=0x7fffffff;    for (int i=1;i<=t;i++)        f[i][0]=0;          l[0]=1;    for (int i=1;i<=m;i++)    {        scanf("%d%d%d%d%d",&a[i][1],&a[i][2],&a[i][3],&a[i][4],&a[i][5]);    }    int k;    for (int i=0;i<=t;i++)        for (int j=1;j<=m;j++)        {               if (a[j][3]==i&&f[i][a[j][1]]!=0x7fffffff&&l[a[j][1]]==1)            {                l[a[j][2]]=1;                for (k=i+a[j][4]+1;k<=t;k++)                    f[k][a[j][2]]=min(f[i][a[j][1]]+a[j][5],f[k][a[j][2]]);            }        }    int ans=0x7fffffff;    for (int i=0;i<=t;i++)        if (f[i][n]!=0) ans=min(ans,f[i][n]);    if (ans==0x7fffffff) ans=-1;    printf("%d\n",ans);    return 0;}
1 0
原创粉丝点击