zl程序教程

您现在的位置是:首页 >  其它

当前栏目

[usaco] Number Triangles

number USACO
2023-09-14 08:59:44 时间
Number Triangles

Consider the number triangle shown below. Write a program that calculates the highest sum of numbers that can be passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.

 7

 8 1 0

 2 7 4 4

 4 5 2 6 5

In the sample above, the route from 7 to 3 to 8 to 7 to 5 produces the highest sum: 30.

PROGRAM NAME: numtri INPUT FORMAT

The first line contains R (1 = R = 1000), the number of rows. Each subsequent line contains the integers for that particular row of the triangle. All the supplied integers are non-negative and no larger than 100.

SAMPLE INPUT (file numtri.in)
5

8 1 0

2 7 4 4

4 5 2 6 5

OUTPUT FORMAT

A single line containing the largest sum using the traversal specified.

SAMPLE OUTPUT (file numtri.out)
30

 

解体的要点在于,把数据转化成二叉树。然后自底向上计算每个节点的高度。但是注意,由于每个节点同时作为两个节点的子节点(一个是左子节点,一个是右子节点)。

这样可能会造成每个节点计算两次,于是设计每个几点的高度初始值为-1. 当判断高度不会-1时,就不必在计算该节点的高度了。之所以初始值不为0,是因为某个test case全为0.

这样还是会造成重复的递归。

我的解法:

/*
ID: yunleis2
PROG: numtri
LANG: C++
*/

#include iostream
#include fstream
#include queue
using namespace std;

#define max(a,b) (a b?a:b)

class node
{
public:
 node * left;
 node * right;
 int value;
 int length;
 node(node * l,node * r)
 {
  left=l;
  right=r;
 }
 node ()
 {left=NULL;right=NULL;value=0;length=-1;}

};
int  search( node *root);
void print(node *);
int main()
{
 fstream fin("numtri.in",ios::in);
 int line;
 fin line;
 int size=(line+1)*line/2;
 node * root=new node();

 queue node *
 fin root- value;
 q.push(root);
 for(int i=1;i line;i++)
 {
  node * last=NULL;
  for(int j=1;j j++)
  {
   node * ptr=q.front();
   q.pop();
   if(j==1)
   {
    ptr- left=new node();
    fin ptr- left- value;
    q.push(ptr- left);
   }
   else
   {
    ptr- left=last- right;
   }
   ptr- right=new node();
   fin (ptr- right)- value;
   last=ptr;
   
   q.push(ptr- right);
  }
 }
 while(!q.empty())
  q.pop();
 //print(root);
 int length=search(root);
 fstream fout("numtri.out",ios::out);
 fout root- length endl;
 //system("pause");
 
}
void print(node * root)
{
 if(root!=NULL)
 {
  cout root- value;
  print(root- left);
  print(root- right);
 }
}
int  search( node *root)
{
 if(root==NULL)
  return 0;
 if(root- length!=-1)
  return root- length;
 root- length=max(search(root- right),search(root- left))+root- value;
 return root- length;
}

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

usaco的解法 Number Triangles
Russ Cox

We keep track (in the "best" array) of total for the best path ending in a given column of the triangle. Viewing the input, a path through the triangle always goes down or down and to the right. To process a new row, the best path total ending at a given column is the maximum of the best path total ending at that column or the one to its left, plus the number in the new row at that column. We keep only the best totals for the current row (in "best") and the previous row (in "oldbest").

#include stdio.h 

#include stdlib.h 

#include string.h 

#include assert.h 


#define MAXR 1000


max(int a, int b)

{

 return a b ? a : b;
}


main(void){

 int best[MAXR], oldbest[MAXR];

 int i, j, r, n, m;
 FILE *fin, *fout;

 fin = fopen("numtri.in", "r");

 assert(fin != NULL);

 fout = fopen("numtri.out", "w");

 assert(fout != NULL);


 fscanf(fin, "%d", 

 for(i=0; i MAXR; i++)

 best[i] = 0;

 for(i=1; i i++) {

 memmove(oldbest, best, sizeof oldbest);

 for(j=0; j j++) {

 fscanf(fin, "%d", 

 if(j == 0)

 best[j] = oldbest[j] + n;

 else

 best[j] = max(oldbest[j], oldbest[j-1]) + n;

 }

 }


 m = 0;

 for(i=0; i i++)

 if(best[i] m)

 m = best[i];


 fprintf(fout, "%d\n", m);

 exit(0);

 

 

 


洛谷 P1348 Couple number 题目描述 任何一个整数N都能表示成另外两个整数a和b的平方差吗?如果能,那么这个数N就叫做Couple number。你的工作就是判断一个数N是不是Couple number。 输入输出格式 输入格式: 仅一行,两个长整型范围内的整数$n_1$和$n_2$,之间用1个空格隔开。
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 6, 8 are ugly while 14 is not ug