UVA 590-Always on the run +dp

UVA 590--Always on the run +dp

定义dp[i][j]表示第i天到达城市j的最小花费

  dp[i][j]=min(dp[i-1][next(j)]+cost(next(j),j))

当然不是每天都会有飞机的,需要判断一下


代码如下:


#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int T[15][15],a[15][15][35];
int dp[1100][15];
int n,k;

void input()
{
   for(int i=1;i<=n;i++)
   {
      for(int j=1;j<=n;j++)
      {
         if(i==j)
            continue;
         scanf("%d",&T[i][j]);
         for(int d=1;d<=T[i][j];d++)
              scanf("%d",&a[i][j][d]);
      }
   }
}

void solve()
{
    memset(dp,0x3f,sizeof(dp));
    dp[0][1]=0;
    for(int i=1;i<=k;i++)
      for(int j=1;j<=n;j++)
      {
          for(int d=1;d<=n;d++)
          {
              if(d==j)
                continue;
              int t=i-(i/T[d][j])*T[d][j];
              if(!t)
                  t=T[d][j];
              if(a[d][j][t]!=0)
              {
                  dp[i][j]=min(dp[i][j],dp[i-1][d]+a[d][j][t]);
              }
          }
      }
    if(dp[k][n]==0x3f3f3f3f)
        printf("No flight possible.\n");
    else
        printf("The best flight costs %d.\n",dp[k][n]);
}

int main()
{
  int Case=0;
  while(scanf("%d%d",&n,&k)!=EOF)
  {
      if(n==0&&k==0)
         break;
      input();
      printf("Scenario #%d\n",++Case);
      solve();
      printf("\n");
  }
  return 0;
}