璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:luogup2362
problems
名称围栏木桩
题目编号P2362
题目链接luogu.com.cn/…
来源Luogu
算法分类动态规划, 线性动态规划, 组合原理
难易程度容易

围栏木桩

非常好的一道题目,简单考察了状态与组合原理。

想法

f[i]为以第i个数为结尾的最长上升子序列的长度,cnt[i]为以第i个数为结尾的最长上升子序列的个数。

每找到一种方案时,cnt需要相加,方案个数增加。

代码实现

#include<cstdio>
int main() {
	int T, n;
	scanf("%d", &T);
	while(T--) {
		int line[30];
		int f[30]={}, cnt[30]={};
		scanf("%d", &n);
		for(int i=1; i<=n; i++) {
			scanf("%d", &line[i]);
			f[i] = 1;
			cnt[i] = 1;
			for(int j=1; j<i; j++)
				if(line[j] <= line[i] && f[i] < f[j] + 1) {	
					f[i] = f[j] + 1;
					cnt[i] = cnt[j];
				}
				else if(line[j] <= line[i] && f[i] == f[j] + 1) {
					cnt[i] += cnt[j];
				}
		}
		int mx = 0, ans = 0;
		for(int i=1; i<=n; i++)
			if(f[i] > mx) {	
				mx = f[i];
				ans = cnt[i];
			}
			else if(f[i] == mx) {
				ans += cnt[i];
			}
		printf("%d %d\n", mx, ans);
	}
	return 0;
} 
/app/www/public/data/pages/icpc/problems/luogup2362.txt · 最后更改: 2024/03/15 06:13 由 温婕莺