[ZPG TEST 110] 多边形个数【DP】
1. 多边形个数
(polygons.pas/c/cpp)
【问题描述】
给定N线段,编号1到n。并给出这些线段的长度,用这些线段组成一个K边形,并且每个线段做多使用一次。若使用了一条不同编号的线段,即视为两个多边形不同。问一共可以组成多少个K边形的多边形。
【输入】
输入文件名为polygons.in。
有多组测试数据:
第一行,包含一个整数Num,表示测试数据的个数。(1<=Num<=10)
每组测试数据,
第一行一个整数N,表示共有N条线段。1<=N<=50.
接下来一行N个整数,表示N条线段的长度[1,50000]。
最后一个整数K[3,10]。
【输出】
输出文件polygons.out共Num行,
一共可以组成多少个不同的K边形。
【输出输出样例】
|
polygons.in |
polygons.out |
|
5 4 1 1 1 1 3 4 2 3 4 5 3 6 4 4 4 2 3 5 10 1 4 4 13 3310 7 |
4 3 11 2 532 |
说实话完全没看出来是DP,还以为是一道想法题。究其原因,就是没有想到多边形的一个性质:一个N边形任意N - 1条边的和必然大于剩下那条边(类比三角形性质),这很显然。那么只要保证最小的N - 1条边的和大于最大的边,就可以构成N边形。
这样子dp的轮廓就出来了,先把给出的线段长度从小到大排序,然后设计状态:f(i, j, k)表示考虑了前i条线段了,其中j条线段的和为k的方案数。那么f(i, j, k) = f(i - 1, j, k) + f(i - 1, j - 1, k - a[i]),这里第三维开的比50000大一点就好了,因为线段最大为50000,那么那些长度和大于50000就可以压缩到一个状态了。每计算完一个i,就把前i - 1条边的和大于a[i]的方案数全部加到ans上,最后一个选的是第i条边时,有几种方案。dp时用滚动数组。
#include <cstdio>
#include <cstring>
#include <algorithm> int T, n, a[55], kk;
long long f[2][15][50005], ans; int main(void) {
freopen("polygons.in", "r", stdin);
freopen("polygons.out", "w", stdout);
scanf("%d", &T);
while (T--) {
ans = 0;
memset(a, 0, sizeof a);
memset(f, 0, sizeof f);
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", a + i);
}
std::sort(a + 1, a + n + 1);
scanf("%d", &kk);
f[0][0][0] = 1;
for (int i = 1; i <= n; ++i) {
memcpy(f[i & 1][0], f[i & 1 ^ 1][0], sizeof f[0][0]);
for (int j = 1; j < kk; ++j) {
for (int k = 0; k < a[i]; ++k) {
f[i & 1][j][k] = f[i & 1 ^ 1][j][k];
}
for (int k = a[i]; k <= 50001; ++k) {
f[i & 1][j][k] = f[i & 1 ^ 1][j][k] + f[i & 1 ^ 1][j - 1][k - a[i]];
}
for (int k = 50002 - a[i]; k <= 50001; ++k) {
f[i & 1][j][50001] += f[i & 1 ^ 1][j - 1][k];
}
}
for (int k = a[i] + 1; k <= 50001; ++k) {
ans += f[i & 1 ^ 1][kk - 1][k];
}
}
printf("%I64d\n", ans);
}
return 0;
}
[ZPG TEST 110] 多边形个数【DP】的更多相关文章
- topcoder-srm701-div2-900 博弈\计算二进制位1的个数\dp\状态压缩
借用一下qls翻译过来的题面 现在有 n 个石子,A 和 B 轮流取石子,A先,每次最多可以取 m 个石子,取到最后一个石子的人获胜,但是某个人如果取完石子时候剩余石子数的二进制表示中有奇数个1,这 ...
- 1202 子序列个数(DP)
1202 子序列个数 题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 子序列的定义:对于一个序列a=a[1],a[2],......a[ ...
- Hzoi 2018.2.11多边形 区间DP
给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: ...
- [luogu]P1026 统计单词个数[DP][字符串]
[luogu]P1026 统计单词个数 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1&l ...
- 多边形——————区间dp
原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...
- poj1179多边形——区间DP
题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后 ...
- 51NOD 1202 子序列个数 DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的 ...
- [ZPG TEST 118] 最大值【dp+离线】
题4 最大值(findmax) [题目描述] 找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令max=a[0](数组下表从0..N-1),如果a[i]>max,就更新max ...
- 数位dp——统计'1'的个数
今天去牛客网看了看 包含一 这道题,一开始没看清,以为它要统计 1~n 所有数中数字 '1' 出现的总次数,也就是说,若 n == 11,则 ans = 4:而按照题目的原意 ans 应该为 3.看错 ...
随机推荐
- [转]JS 引擎的执行机制
转: https://www.cnblogs.com/wancheng7/p/8321418.html ------------------------------------------------ ...
- Data obtained from ping: is it round trip or one way?
I have 2 servers, each in two separate locations. I need to host an application on one, and the data ...
- ITIL的考核管理体系
是的,我们ITIL的考核管理体系,大概是从几个方面进行考核的.阿里巴巴作为一个上市公司,是全球的B2B电子商务的领先者,那么作为我们的运维部,保证完整的可用性是首当其冲的.我们的ITIL考核体系里面, ...
- hdoj 2046 骨牌铺方格 【DP】+【斐波那契】
dp果然不是好学的... 第n个,即2*n时,可由第n-1个的竖直排列再加一个,和第n-2个中横着排两个 所以f(n) = 1×f(n-1) + 1×f(n-2): 骨牌铺方格 Time Limit: ...
- Python 点滴 I
[为什么使用Python] 1. 软件质量: Python更注重软件质量,一致性,可维护性 2. 开发效率: 相比C/C++/Java这些编译/静态语言,无需编译及链接步骤,Python所须要 ...
- ZOJ 2859 二维线段树
思路:自己写的第二发二维线段树1A.哈哈,看来对二维的push操作比較了解了:可是还没遇到在两个线段树中同一时候进行push操作的,事实上这题我是想在x维和y维同一时候进行push操作的.可是想了好久 ...
- sql server 系统常用函数:聚合函数 数学函数 字符串函数 日期和时间函数和自定义函数
一.系统函数 1.聚合函数 聚合函数常用于GROUP BY子句,在SQL Server 2008提供的所有聚合函数中,除了COUNT函数以外,聚合函数都会忽略空值AVG.COUNT.COUNT_BIG ...
- elasticsearch_初始篇
一.elasticsearch简单介绍 Elasticsearch 是一个基于Lucene的分布式.可扩展.近实时的搜索与数据分析引擎. 它能从项目一开始就赋予你的数据以搜索.分析和探索的能力. 实时 ...
- (16)ServletContext详解
1,作用: ServletContext对象 ,叫做Servlet的上下文对象.表示一个当前的web应用环境.一个web应用中只有一 ...
- Lightoj 1018 - Brush (IV)
1018 - Brush (IV) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Muba ...