URAL1029. Ministry(DP+路径)
路径麻烦啊 很多细节 倒回去搜一遍
卡了一节数据库。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",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\n",u); 97 else 98 dfs(u,n-1); 99 return 0; 100 }