smoj-1042数字三角形

来源:互联网 发布:网站视频分段播放 php 编辑:程序博客网 时间:2024/05/21 19:36

 暑假的时候想这题,就想了好久可怜,今天终于知道怎么做啦~好开心~来写写~嘿嘿~和大家分享下吧~(数字三角形)

这题据说是动态规划的入门题,大家好好看看哦~嘿嘿~我给大家讲讲思路吧~希望对你们有帮助~嘿嘿~大笑

思路:从上至下的计算,与下面相邻数字之和比较大的那个,赋值给上面的那个数,一个个加上去,这样说,是不是有点小困惑呢,嘿嘿~给大家画一个图吧:

下面是程序:

#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));
 }
}

这是今天上午改写的,希望对大家有所帮助~吐舌头

 

 

 

 

 

原创粉丝点击