大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

P1025 数的划分

此题我是做过的,挑战上的一道题

刚开始想:不就是隔板法吗?但是此题不同顺序算同一种方案,隔板法显然无法解决此类问题,只能用计数类DP

但是由于数据水,暴搜也可以过

我们根据是否包含1划分 ,f[i][j]=f[i-1][j-1]+f[i-j][j];

这体现了“围绕一个基准点把一个大问题划分为两个没有交集的部分”的思想

#include<bits/stdc++.h>
using namespace std;

#define go(i,a,b) for(int i=a;i<=b;++i)
#define com(i,a,b) for(int i=a;i>=b;--i)
typedef long long ll;

ll f[206][26];
int n,m;

int main(){
	//freopen("input.txt","r",stdin);
	cin>>n>>m;
	if(m>n){
		puts("0");
		return 0;
	}
	f[0][0]=1;
	go(i,1,n)
		go(j,1,min(i,m)){
			f[i][j]=f[i-1][j-1]+f[i-j][j];
		}
	printf("%lld",f[n][m]);
	return 0;
}
posted @ 2019-09-09 21:13  White_star  阅读(144)  评论(0编辑  收藏  举报
}