定义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;
}