USACO-1.5.2-Number triangles

来源:互联网 发布:有利网 知乎 编辑:程序博客网 时间:2024/06/01 21:47

题目链接:http://train.usaco.org/usacoprob2?a=zGnNu71M0aJ&S=numtri

题目大意:算这个数字三角阵的最大值,从顶向下,一个数字可以加它下方或者右下方的数字。是一道经典的贪心算法的题目。放在这一个小结里好像主要是为了掌握滚动数组的使用,就是k ^ 1的那个部分吧。

解题思路:经典的贪心算法题,算到每一行的最大值。我对这道题目的印象特别深刻。代码如下:

#include <iostream>#include <fstream>#include <cstring>using namespace std;int maxOne(int a, int b){    return a > b ? a : b;}int main(){    ifstream fin("numtri.in");    ofstream fout("numtri.out");    int a[1001], iMax[2][1001];  //只需要记录下当前行的最大值和前一行能得到的最大值    int k, n, ans;    memset(iMax, 0, sizeof(iMax));    memset(a, 0, sizeof(a));    fin >> n;    k = 0;    for (int i = 1; i <= n; ++i)    {        k = k ^ 1;   //k会在0和1之间不断切换        for (int j = 1; j <= i; ++j)        {            fin >> a[j];            iMax[k][j] = a[j] + maxOne(iMax[k ^ 1][j], iMax[k ^ 1][j - 1]);        }       }    ans = 0;    for (int i = 1; i <= n; ++i)    {        ans = iMax[k][i] > ans ? iMax[k][i] : ans;    }    fout << ans << endl;    fin.close();    fout.close();    return 0;}
0 0