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 由 温婕莺