题目链接: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;
}