USACO 1.5.1 Number Triangles

题意:经典数字三角形最大问题

解法:基本动态规划

        dp[i][j]表示以(i,j)结束的最大值, 转移方程:dp[i][j] = max{dp[i-1][j-1], dp[i-1][j]} + num[i][j], 结果为max dp[n - 1][j]

        当然也可以设置dp[i][j]表示从(i, j)出发所能获得的最大值 dp[i][j] = max{dp[i+1][j], dp[i+1][j+1]} + num[i][j]

USACO题目的复杂度有些跳跃

/*
ID: lsswxr1
PROG: numtri
LANG: C++
*/
#include <iostream>
#include <vector>
#include <map>
#include <list>
#include <set>
#include <deque>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <cctype>
#include <cstdio>
#include <iomanip>
#include <cmath>
#include <cstdio>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;

#define USACO
#ifdef USACO
#define cin fin
#define cout fout
#endif
//////////////////////////////////////////////////////////////////////////
///宏定义
const int  INF = 1000000000;
const int MAXN = 1021;
const int maxn = MAXN;
///全局变量 和 函数
int R;
int num[maxn][maxn];
int dp[maxn][maxn];
int main()
{


#ifdef USACO    
    ofstream fout ("numtri.out");
    ifstream fin ("numtri.in");
#endif   
    
    while (cin >> R)
    {
        for (int i = 0; i < R; i++)
        {
            for (int j = 0; j < i + 1; j++)
            {
                cin >> num[i][j];
                dp[i][j] = -INF;
            }
        }
        int ans = 0;
        dp[0][0] = num[0][0];

        for (int i = 1; i < R; i++)
        {
            for (int j = 0; j < i + 1; j++)
            {
                if (j - 1 >= 0)
                {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j - 1] + num[i][j]);
                    ans = max(ans, dp[i][j]);
                }
                if (j < i)
                {
                    dp[i][j] = max(dp[i][j], dp[i - 1][j] + num[i][j]);
                    ans = max(ans, dp[i][j]);
                }
            }
        }
        cout << ans << endl;
    }


    ///结束
    return 0;
}

 

posted on 2013-12-26 11:01  小书包_Ray  阅读(230)  评论(0编辑  收藏  举报

导航