uva 590

来源:互联网 发布:网络下载速度很不稳定 编辑:程序博客网 时间:2024/06/17 01:08
import java.io.*;import java.util.*;public class Main{    public static void main(String[] args) throws Exception {        Scanner scan = new Scanner(System.in);        int count = 0;        while (true) {            count++;            int n = scan.nextInt();            if (n == 0) {                return;            }            int[][][] map = new int[n+1][n+1][30];            int d = scan.nextInt();            int[][] table = new int[n+1][d + 1];            for (int i = 1; i <= n; i++) {                for (int j = 1; j <= n; j++) {                    if (j == i) {                        continue;                    }                    int tmp = scan.nextInt();                    map[i][j][0] = tmp;                    for (int k = 1; k <= tmp; k++) {                        map[i][j][k] = scan.nextInt();                    }                }            }            for(int i=0;i<=n;i++){                Arrays.fill(table[i], 9999999);            }            table[1][0] = 0;            for (int j = 1; j <= d; j++) {                for (int i = 1; i <= n; i++) {                             table[i][j] = 9999999;                    for (int t = 1; t <= n; t++) {                        if (t == i) {                            continue;                        }                        int num = (j-1) % map[t][i][0] +1;                        if(map[t][i][num]==0||table[t][j-1]==9999999){                            continue;                        }                        table[i][j] = Math.min(table[i][j], table[t][j - 1] + map[t][i][num]);                    }                }            }            //Dumper.print_2_arr(table, n+1, d+1);            System.out.println("Scenario #" + count);            if (table[n][d] < 9999999) {                System.out.println("The best flight costs " + table[n][d] + ".\n");            } else {                System.out.println("No flight possible.\n");            }        }    }}

思路的正确的,代码又没写对。不过话说思路实在是比较明显。。。尤其是在你知道这是DP题的时候,不往图论上想的话那么思路是很明显的。

开始想了一个3维的dp,写着WA。。。其实就是dp[i][j][k], 代表了从i 到 j, 在第K天的最小花费。

后来开了别人的代码,发现全部初始化成9999999, 然后dp[1][0] = 0. 在后面的代码加一个条件,如果dp[j][i-1] == 999999, continue;

这样就跳过了这个城市,也就是说最开始只有城市1会被处理,那么后面表了的值全是由城市1推出来的。

这样就降了一维,不知道N立方的会不会TLE,毕竟城市只有15.

Anyway。。。

原创粉丝点击