这样写错在哪?不理解为什么会输出较大值

P1216 [USACO1.5] [IOI1994]数字三角形 Number Triangles

Sky_valley @ 2018-05-15 21:25:23

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define _ 1005
int mp[_][_],dp[_][_];
int n;
int dfs(int x,int y)
{
    if(x==n){ dp[x][y]=mp[x][y]; return mp[x][y];}
    int p,q;
    if(dp[x+1][y]>=0) p=dp[x+1][y];
    else p=dfs(x+1,y);
    if(dp[x+1][y+1]>=0) q=dp[x+1][y+1];
    else q=dfs(x+1,y+1);
    dp[x][y]=max(q,p) + mp[x][y];
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=i;++j) scanf("%d",&mp[i][j]),dp[i][j]=-1;
    dfs(1,1);
    cout<<dp[1][1]<<endl; return 0;
}

by Sky_valley @ 2018-05-15 21:32:41

我把dfs中最后一句 换成

return dp[x][y]=max(q,p) + mp[x][y];

就A掉了,但不懂是为什么.


by Sky_valley @ 2018-05-15 21:35:42

仿佛失了智


by memset0 @ 2018-05-15 21:38:06

因为你的dfs是需要返回值的啊

if(dp[x+1][y]>=0) p=dp[x+1][y];
else p=dfs(x+1,y);

by 不到前10不改名 @ 2018-05-15 21:38:41

@Sky_valley 这样打貌似只会返回一层吧~


by Sky_valley @ 2018-05-15 21:51:46

谢谢啦,发现了,这样打没有返回值……


|