题目是这样的,给一个数字三角形,让你求和最大的路径,还有一个题是求和最小的路径,示例数据都是一样的, 所以没有贴那个题的图。
对于一个刚刚熟悉DP的萌新来说,开始拿到这道题是既有点激动又有点懵逼的。
废话不多说,直接上代码了 第一个代码是DP的,用的那个什么规划方程,中间修修改改好多次,终于是做出来了。
其中有这么几个常犯的错误:1、输入的时候,i是从0-n-1,但是j是从0-i+1,我弄成j是从0-n-1了。 2、计算dp的时候,i是从n-2开始的,逐渐递减,到0。3、dp[i][j]=max(dp[i+1][j]+a[i+1][j],dp[i+1][j]+a[i+1][j]),千万不要写成dp[i][j]=max(a[i+1][j],a[i+1][j+1])+dp[i][j],因为你之前一行的dp木有加进来啊啊!4、dp全部赋值为0,并且写在while循环里哦。5、输出的时候加上a[0][0].因为这个算的是之前一行的dp,这一行的a没加。
下面是dp的代码。
/*dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])*/
#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[110][110];
int main()
{
memset(dp,0,sizeof(dp));
int n,i,j;
int a[110][110];
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<i+1;j++)
scanf("%d",&a[i][j]);
for(i=n-2;i>=0;i--)
for(j=0;j<i+1;j++)
dp[i][j]=max(dp[i+1][j]+a[i+1][j],dp[i+1][j+1]+a[i+1][j+1]);
printf("%d",dp[0][0]+a[0][0]);
return 0;
}
/***************************************************
Result: Accepted
Take time: 0ms
Take Memory: 196KB
Submit time: 2017-04-14 15:45:24
****************************************************/
然后是作死写dfs的代码,貌似超时了,就没再纠结了。如果能用dfs做的话,等我厉害了,我会再回来用更高效的dfs做出来的。
/*dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])*/
#include <stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[110][110],n;
int dp(int i,int j)
{
int sum=0;
if(i==n-1)
return a[i][j];
else sum+=max(dp(i+1,j),dp(i+1,j+1))+a[i][j];
return sum;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<i+1;j++)
scanf("%d",&a[i][j]);
i=0;j=0;
printf("%d\n",dp(i,j));
return 0;
}
/***************************************************
Result: Time Limit Exceeded
Take time: 1010ms
Take Memory: 0KB
Submit time: 2017-04-14 16:15:46
****************************************************/
好了,就这样吧,一道最简单的dp,被老子做了一个多小时。