定义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; }
UVA 590--Always on the run +dp
原文地址:http://blog.csdn.net/acm_lkl/article/details/43085009