其他分享
首页 > 其他分享> > 新“愚公移山”-- 动态规划

新“愚公移山”-- 动态规划

作者:互联网

新“愚公移山”

http://go.helloworldroom.com:50080/problem/2721

 

题目描述

为了吸引中小学生,参观博物院不再停留在看和听,核心理念转变成了互动。新“愚公 移山”项目,屏幕上出现 n 个石块,屏幕下方的底盘是二维方格,每个方格恰好能放置一个 石块。石块放置的规则是:底盘每一竖行方格组成一列,必须从最左边的一列开始摆放,每 列从最下面的方格开始连续摆放积木,底盘至少要放两列,后一列放的积木数至少比前一列 多一个。n 个石块共有多少种摆放方案呢? 下图为 5 个积木所能摆放的 2 种方案。

avatar

输入格式

一行,包含一个正整数 n,表示生成的石块个数。

输出格式

一行,包含一个数,表示按规则摆放石头的方案总数。

样例数据

input

5

output

2

对于 40%的数据满足 n≤10; 对于 80%的数据满足 n≤100; 对于 100%的数据满足 n≤200;

 

思路

 

解法

#include <bits/stdc++.h>
#include <vector>
#include <algorithm>
#include <deque>
#include <queue>
#include <string>
#include <set>
using namespace std;

int N;
int f[202][202] = {{0}};

int main() {
    cin >> N;

    // n rocks are in one column
    for (int n = 1; n <= N; n++) {
        f[n][1] = 1;
    }

    // 1 rock is with any number of columns
    for (int m = 2; m <= N; m++) {
        f[1][m] = 0;
    }

    // column is increasing
    for (int m = 2; m <= N; m++) {
        for (int n = 2; n <= N; n++) {
            f[n][m] = 0;


            int a1_max = n / m;
            for (int k = 1; k <= a1_max; k++) {
                int left_n = n - m * k;
                f[n][m] += f[left_n][m - 1];
            }
        }
    }

//    cout << endl;
//    cout << "----------------------------";
//    for (int n = 1; n <= N; n++) {
//        for (int m = 1; m <= N; m++) {
//            cout << f[n][m] << " ";
//        }
//        cout << endl;
//    }
//    cout << endl;

    int count = 0;
    for (int m = 2; m <= N; m++) {
//        cout << "m == " << m << " " << f[N][m] << endl;
        count += f[N][m];
    }

    cout << count << endl;
}

 

标签:愚公移山,动态,--,石块,摆放,int,方格,include,一列
来源: https://www.cnblogs.com/lightsong/p/16305290.html