描述:没什么难度,比较水一点的题 #include <cstdio> #include <cstring> struct fli { int d[10]; int flight[10][35]; int sum; int count; }; fli f[12]; int main() { // freopen("a.txt","r",stdin); int n,m,k,t=0,p; int v[12]; while(scanf("%d%d",&n,&k)!=EOF) { if(!n&&!k) break; for(int i=0; i<n; i++) { f[i].sum=f[i].count=0; for(int j=0; j<n-1; j++) { scanf("%d",&f[i].d[j]); for(int l=0; l<f[i].d[j]; l++) scanf("%d",&f[i].flight[j][l]); } } for(int i=0; i<n-1; i++) if(f[0].flight[i][0]) f[i+1].sum+=f[0].flight[i][0],f[i+1].count=1; for(int i=2; i<=k; i++) { memset(v,0,sizeof(v)); for(int j=0; j<n; j++) if(f[j].count==i-1) { for(int l=0; l<n-1; l++) { m=i%f[j].d[l]-1; if(m<0) m+=f[j].d[l]; if(f[j].flight[l][m]) { if(j<=l) p=l+1; else p=l; if(!v[p]||v[p]>f[j].flight[l][m]+f[j].sum) v[p]=f[j].flight[l][m]+f[j].sum; } } } for(int j=0; j<n; j++) if(v[j]) f[j].sum=v[j],f[j].count=i; } printf("Scenario #%d\n",++t); if(f[n-1].count==k) printf("The best flight costs %d.\n\n",f[n-1].sum); else printf("No flight possible.\n\n"); } return 0; }