POJ 2353 Ministry
题意:
给你一个n*m的矩阵,每个矩阵有一个数,表示在位置(i,j)办理手续的费用,在(i,j)办理完手续之后,你可以到(i+1,j)或者(i,j+1)或者(i,j-1)的位置继续办理手续,办完所有的手续定义为从(1,j)开始,到(n,j’)结束的整个过程,要求你求出办完手续的最小费用,并且输出方案。
解题过程:
我们首先可以想到DP的方法,但是对于(i,j)有三种转移的来源,为了不漏掉方案,我们可以对于每一行进行从左往右和从右往左的两次DP,然后用pre数组记录前缀用于输出方案就行了。
AC代码:
#pragma GCC optimize (3)#include #include #include #include #include #include #include
ans; ans.push_back(pos); while(ii>1) { ans.push_back(pre[ii][pos]); if(pos==pre[ii][pos]) { ii--; } else { pos=pre[ii][pos]; } } for(int i=ans.size()-1;i>=0;i--) { printf("%d\n",ans[i]); } return 0;}