新“愚公移山”-- 动态规划
作者:互联网
新“愚公移山”
http://go.helloworldroom.com:50080/problem/2721
题目描述
为了吸引中小学生,参观博物院不再停留在看和听,核心理念转变成了互动。新“愚公 移山”项目,屏幕上出现 n 个石块,屏幕下方的底盘是二维方格,每个方格恰好能放置一个 石块。石块放置的规则是:底盘每一竖行方格组成一列,必须从最左边的一列开始摆放,每 列从最下面的方格开始连续摆放积木,底盘至少要放两列,后一列放的积木数至少比前一列 多一个。n 个石块共有多少种摆放方案呢? 下图为 5 个积木所能摆放的 2 种方案。
输入格式
一行,包含一个正整数 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