http://www.rqnoj.cn/Problem_73.html
题目:展演队型
问题编号:73
题目描述
学校要每个班出一个表演项目,但是为了让队伍里的同学都露一下脸所以老师要求前一排的人必须比后一排的人少为了好看也不能相等,显然这种无聊又无趣的工作又要由superwyh来做,superwyh很苦恼,于是superwyh就把这活推给sjh了,所以分配完任务后superwyh的职责就是统计一共有多少种可能来打击一下sjh,所以各位oier再帮一下superwyh吧。
输入格式
一个数,代表班级人数(1<=n<=130)。
输出格式
一个数,所有可能树。
样例输入
20
样例输出
63
一、思路
一直没想明白,该如何描述和定义最优解形式
究竟应该是,先找一种描述方式,还是应该先想下最优解是那种形式
觉得应该是先想最优解形式,然后找一种数学描述,转换为,计算机
写出递归式,记忆求解,或者从小向上记录求解
f[i][j] = sum (f[i-j][k]) 1<=k<j
f[i][j]表示i个人,最后一排有J个人时的排列数
二、算法
1、读入N
2、二重循环动规求解
3、输出结果:sum = sum(f[n][j]) 1<=j<n
代码如下
AC了
#include <iostream.h>
int main()
{
int n, f[31][31] = {0};
int i, j, k;
int sum;
//读入人数
cin>>n;
//递归求解
f[0][0] = 1;
for (i=1; i<=n; i++)
{
for (j=1; j<=i; j++)
{
for (k=0; k<j; k++)
{
f[i][j] += f[i-j][k];
}
}
}
//输出结果
sum = 0;
for (i=0; i<n; i++)
{
sum += f[n][i];
}
cout<<sum;
return 0;
}