Uva(10564)(Paths through the Hourglass)

链接:https://vjudge.net/problem/UVA-10564
思路:dp题,有点像数字三角形,但是因为要涉及路径输出我们不能把它拆为两个来做,还是直接记忆式搜索吧,以n为边界,上下采取不同的状态转移方程。。记住记忆式搜索不要用dp数组的值是否为0来判断是否查询过,因为本题很多点都为0(表示无解),养成好习惯用vis来判重,我就是这种不好习惯导致这道题一开始tl了。然后枚举第一排所有起点,第一个找到的解一定是题目要求最优的!
代码:

#include
#include
#include
#include
using namespace std;
int a[51][51];
long long dp[51][51][501];
int vis[51][51][501];
int n,s,cnt,id;
string ress;

long long dfs(int i,int j,int k,string path){
if(dp[i][j][k]||vis[i][j][k])return dp[i][j][k];
vis[i][j][k] = 1;
if(k<0||i>2*n)return 0;
if(i==2*n&&k==0){
    if(id==-1)id=cnt,ress = path;
    return 1;
}
long long &sum = dp[i][j][k];
//上半区的状态转移
if(i

你可能感兴趣的:(Uva(10564)(Paths through the Hourglass))