暑假的时候想这题,就想了好久,今天终于知道怎么做啦~好开心~来写写~嘿嘿~和大家分享下吧~(数字三角形)
这题据说是动态规划的入门题,大家好好看看哦~嘿嘿~我给大家讲讲思路吧~希望对你们有帮助~嘿嘿~
思路:从上至下的计算,与下面相邻数字之和比较大的那个,赋值给上面的那个数,一个个加上去,这样说,是不是有点小困惑呢,嘿嘿~给大家画一个图吧:
下面是程序:
#include<stdio.h>
int max(int a,int b)
{
if(a>b)
return a;
else return b;
}
int main()
{
int n,i,j,a[100][100],z=1;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=n-1;i>0;i--)
for(j=1;j<=i;j++)
{
a[i][j]=max(a[i+1][j]+a[i][j],a[i][j]+a[i+1][j+1]);
}
printf("Triangle #%d: %d\n",z++,a[1][1]);
}
}是不是很简单呢~嘿嘿~大家一起加油吧~希望明天可以好好学了哦~嘿嘿~
上面的用动态规划做的~
下面给大家用递归的方法做:
#include<stdio.h>
int n,i,j,a[100][100],z=1;
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
int p(int i,int j)
{
if(i==n)
return a[i][j];
return a[i][j]+max(p(i+1,j),p(i+1,j+1));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
printf("Triangle #%d: %d\n",z++,p(1,1));
}
}这是今天上午改写的,希望对大家有所帮助~