FOJ Problem 1004 Number Triangle

来源:互联网 发布:ddos网络层攻击 编辑:程序博客网 时间:2024/05/29 09:16

<h2>Problem Description</h2><div class="pro_desc"><p>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.</p><center><img src="data:image/png;base64,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" alt="" /></center><p>In the sample above, the route from 7 to 3 to 8 to 7 to 5 produces the highest sum: 30.</p></div><h2><img src="http://acm.fzu.edu.cn/image/prodesc.gif" alt="" /> Input</h2><div class="pro_desc">There are multiple test cases.The first line of each test case 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.</div><h2><img src="http://acm.fzu.edu.cn/image/prodesc.gif" alt="" /> Output</h2><div class="pro_desc">Print a single line containing the largest sum using the traversal specified for each test case.</div><h2><img src="http://acm.fzu.edu.cn/image/prodesc.gif" alt="" /> Sample Input</h2><div class="data">5</div><div class="data">7</div><div class="data">3 8</div><div class="data">8 1 0</div><div class="data">2 7 4 4</div><div class="data">4 5 2 6 5</div><h2><img src="http://acm.fzu.edu.cn/image/prodesc.gif" alt="" /> Sample Output</h2><div class="data">30 </div><div></div>
//动态规划逆推 # include "stdio.h" # include <iostream># include <algorithm>using namespace std;int a[1010][1010];int p[1010];int main(){int n, j, k;while(scanf("%d", &n)!=EOF){for(j=1; j<=n; j++){for(k=1; k<=j; k++){scanf("%d", &a[j][k]);}}for(j=1; j<=n; j++){p[j]=a[n][j];}for(j=n-1; j>=1; j--){for(k=1; k<=j; k++){p[k]=max(a[j][k]+p[k], a[j][k]+p[k+1]);}}printf("%d\n", p[1]);}return 0;}

//采用stl动态数组vector # include "stdio.h" # include <iostream># include <algorithm># include <vector>using namespace std;vector<int> m[1010];int p[1010];int main(){int n, j, k, num;while(scanf("%d", &n)!=EOF){for(j=0; j<=n-1; j++){for(k=0; k<=j; k++){scanf("%d", &num);m[j].push_back(num);}}for(j=0; j<=n-1; j++){p[j]=m[n-1][j];}for(j=n-2; j>=0; j--){for(k=0; k<=j; k++){p[k]=max(m[j][k]+p[k], m[j][k]+p[k+1]);}}for(j=0; j<=n-1; j++){vector <int>().swap(m[j]);}printf("%d\n", p[0]);}return 0;}

//方法三,记忆化搜索# include "stdio.h" # include <iostream># include <algorithm># include "string.h"using namespace std;int a[1010][1010];int p[1010][1010];int n;int d(int i, int j){if(p[i][j]>=0)return p[i][j];return p[i][j]=a[i][j]+(i==n?0:max(d(i+1, j), d(i+1, j+1)));}int main(){int j, k;while(scanf("%d", &n)!=EOF){for(j=1; j<=n; j++){for(k=1; k<=j; k++){scanf("%d", &a[j][k]);}}memset(p, -1, sizeof(p));printf("%d\n", d(1, 1));}return 0;}   



0 0
原创粉丝点击