zoukankan      html  css  js  c++  java
  • URAL1029. Ministry(DP+路径)

    链接

    路径麻烦啊 很多细节 倒回去搜一遍

    卡了一节数据库。。

      1 #include <iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<algorithm>
      5 #include<stdlib.h>
      6 using namespace std;
      7 #define LL long long
      8 int u,o,path[50010],flag;
      9 LL sum[110][510],dp[110][510],f[110][510];
     10 int m,n;
     11 void dfs(int u,int v)
     12 {
     13     if(flag)
     14     return ;
     15     int i,j,tt=o;
     16     if(v==1)
     17     {
     18         o++;
     19         path[o] = u;
     20         for(i = o ; i > 1 ; i--)
     21         printf("%d ",path[i]);
     22         printf("%d
    ",path[1]);
     23         flag = 1;
     24         return ;
     25     }
     26     if(dp[v][u]==dp[v-1][u]+f[v][u])
     27     {
     28         o = tt;
     29         path[++o] = u;
     30         dfs(u,v-1);
     31     }
     32     for(i = u-1; i >= 1 ; i--)
     33     {
     34         if(dp[v][i]!=dp[v-1][i]+f[v][i])
     35         continue;
     36         o = tt;
     37         if(dp[v][u]==dp[v][i]+sum[v][u]-sum[v][i])
     38         {
     39             for(j = u ; j>= i ; j--)
     40             path[++o] = j;
     41             dfs(i,v-1);
     42         }
     43     }
     44     for(i = u+1 ; i <= m ; i++)
     45     {
     46         if(dp[v][i]!=dp[v-1][i]+f[v][i])
     47         continue;
     48         o = tt;
     49         if(dp[v][u]==dp[v][i]+sum[v][i-1]-sum[v][u-1])
     50         {
     51             for(j = u; j <= i; j++)
     52             path[++o] = j;
     53             dfs(i,v-1);
     54         }
     55     }
     56     o = tt;
     57 }
     58 int main()
     59 {
     60     int i,j,g;
     61     flag=0;
     62     scanf("%d%d",&n,&m);
     63     for(i = 1; i <= n ;i++)
     64     {
     65         for(j = 1; j <=m ; j++)
     66         {
     67             scanf("%lld",&f[i][j]);
     68             sum[i][j] = sum[i][j-1]+f[i][j];
     69         }
     70     }
     71     for(i = 1 ;i <= n ;i++)
     72     {
     73         for(j = 1; j <=m ; j++)
     74         dp[i][j] = dp[i-1][j]+f[i][j];
     75         for(j = 1; j <= m ; j++)
     76         {
     77             for(g = 1; g < j ;g++)
     78             dp[i][j] = min(dp[i][j],dp[i][g]+sum[i][j]-sum[i][g]);
     79             for(g = j+1 ; g <=m ; g++)
     80             dp[i][j] = min(dp[i][j],dp[i][g]+sum[i][g-1]-sum[i][j-1]);
     81         }
     82     }
     83     LL ans = dp[n][1],u = 1;
     84     for(i = 1; i <= m ; i++)
     85     {
     86         if(ans>=dp[n][i])
     87         {
     88             ans = dp[n][i];
     89             if(dp[n][i]==dp[n-1][i]+f[n][i])
     90             u = i;
     91         }
     92     }
     93     o++;
     94     path[o] = u;
     95     if(n==1)
     96     printf("%d
    ",u);
     97     else
     98     dfs(u,n-1);
     99     return 0;
    100 }
    View Code
  • 相关阅读:
    基于MATLAB求解矩阵的正交补矩阵
    MySQL的安装与配置
    删除ubuntu后修复win7系统的引导
    VS2010中快捷添加命名空间
    java学习之函数
    java学习之break 和 continue
    For循环复杂练习
    For循环练习之99乘法表和转义字符
    java学习之语句结构
    java学习之运算符
  • 原文地址:https://www.cnblogs.com/shangyu/p/3301069.html
Copyright © 2011-2022 走看看