zoukankan      html  css  js  c++  java
  • DP——地道战

    Description

    大家一定看过地道战的电视吧。 话说小兵张嘎有一回也跑去支援地道战了。那是河北的一个小镇里,这个小镇比较复杂,什么样的人都有。所以张嘎不能走大街,只能在地道里走。但根据地质情况不同,所以同样长的街道,地道里要走的时间可能不一样。当然每条街道下面都有地道,而且在街道连接处地道也有连接。有一天张嘎在A处,突然发现有大部队的敌军前来,所以他必须以尽快的速度跑到B处通知分队隐蔽,每条地道上都标出了他要走的时间。请帮他算一下,怎么走时间最短。
                   A +---2---+---3---+----1---+----2---+
                     |       |       |        |        |
                     2       1       2        2        3
                     |       |       |        |        |
                     +---2---+---3---+----4---+---5----+
                     |       |       |        |        |
                     3       4       1        2        3
                     |       |       |        |        |
                     +---2---+---2---+---1----+---4----+
                     |       |       |        |        |
                     2       2       1        3        4
                     |       |       |        |        |
                     +---1---+---3---+---2----+---3----+ B 
    

    Input

    有多个测试案例。 每个测试案例,第1行输入2个整数N和M (1 <= n,m <=100)分别表示横向的街道的条数和纵向街道的条数。 以下n行每行输入各段地道(横向)需要的时间,每行按从左到右的顺序 一下m行每行输入各段地道(纵向)需要的时间,每列按从上到下的顺序 处理到文件末尾

    Output

    对每个测试案例输出一行,输出他从A到B的最短时间

    Sample Input

    4 5
    2 3 1 2
    2 3 4 5
    2 2 1 4
    1 3 2 3
    2 3 2
    1 4 2
    2 1 1
    2 2 3
    3 3 4

    Sample Output

    13

    HINT

    只能向下或向右

    大意:求最短路就是另所有的路为无穷大,能走的取最小值,最后输出dp[n][m],这道题的数据处理有点难..

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int inf = 0x3f3f3f3f;
    int main()
    {
        int dp[110][110];
        int x[110][110],y[110][110];
        int n,m;
        while(~scanf("%d%d",&n,&m)){
        //heng
        for(int i = 0; i <= n ;i++)
            for(int j = 0 ; j <= m ;j++)
              x[i][j] = y[i][j] = dp[i][j] = inf;
        for(int i = 1; i <= n;i++){
            for(int j = 1; j <= m-1 ;j++){
                scanf("%d",&x[i][j]);
            }
        }
        //shu
        for(int i = 1; i <= m ;i++){
            for(int j = 1; j <= n-1 ;j++){
                scanf("%d",&y[i][j]);
            }
        }
        dp[1][1] = 0;
        for(int i = 1;i <= n;i++){
          for(int j = 1; j <= m;j++){
                if(i == 1 && j == 1)
                continue;
               dp[i][j] = 0;
               dp[i][j] +=min(dp[i-1][j] + y[j][i-1],dp[i][j-1]+x[i][j-1]);
           }
         }
        printf("%d
    ",dp[n][m]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    角色总结
    cookie
    基础php链接SQL数据库
    html
    PHP 每天的总结(1)
    php的特性
    [转载]CS0234: 命名空间“System.Data”中不存在类型或命名空间名称“OracleClien...
    [转载]数据库镜像中证书过期的解决方案
    华师大陈默老师的育儿讲
    [转载]如何使用VMware Workstation 8将物理机转换为虚拟机?
  • 原文地址:https://www.cnblogs.com/zero-begin/p/4374699.html
Copyright © 2011-2022 走看看