USACO-1.5.2-Number triangles

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

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

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

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

你可能感兴趣的:(acm,贪心算法)