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
2 2

3

5

10 1 4
9 20

4

13

3310
1660 211 1260 160 213 884 539 17212 2025 105 120 5510

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】的更多相关文章

  1. topcoder-srm701-div2-900 博弈\计算二进制位1的个数\dp\状态压缩

    借用一下qls翻译过来的题面  现在有 n 个石子,A 和 B 轮流取石子,A先,每次最多可以取 m 个石子,取到最后一个石子的人获胜,但是某个人如果取完石子时候剩余石子数的二进制表示中有奇数个1,这 ...

  2. 1202 子序列个数(DP)

    1202 子序列个数 题目来源: 福州大学 OJ 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 子序列的定义:对于一个序列a=a[1],a[2],......a[ ...

  3. Hzoi 2018.2.11多边形 区间DP

    给定一个由N个顶点构成的多边形,每个顶点被赋予一个整数值,而每条边则被赋予一个符号:+(加法运算)或者*(乘法运算),所有边依次用整数1到N标识. 一个多边形的图形表示 首次移动,允许将某条边删除: ...

  4. [luogu]P1026 统计单词个数[DP][字符串]

    [luogu]P1026 统计单词个数 题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1&l ...

  5. 多边形——————区间dp

    原题链接:https://www.acwing.com/problem/content/285/ 题意简单来说就是:给你一个环,断掉一条边使其成为一个链,用这个链跑dp,求最大得分. 首先这不是一道板 ...

  6. poj1179多边形——区间DP

    题目:http://poj.org/problem?id=1179 区间DP,值得注意的是有负值,而且有乘法,因此可能会影响最大值: 注意memset中写-1仅仅是-1,-2才是一个很小的负数: 最后 ...

  7. 51NOD 1202 子序列个数 DP

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1202&judgeId=225600 这题看起来挺复杂,但是真正的 ...

  8. [ZPG TEST 118] 最大值【dp+离线】

    题4  最大值(findmax) [题目描述] 找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令max=a[0](数组下表从0..N-1),如果a[i]>max,就更新max ...

  9. 数位dp——统计'1'的个数

    今天去牛客网看了看 包含一 这道题,一开始没看清,以为它要统计 1~n 所有数中数字 '1' 出现的总次数,也就是说,若 n == 11,则 ans = 4:而按照题目的原意 ans 应该为 3.看错 ...

随机推荐

  1. ArcSDE数据库连接(直连、服务连)与GT_Geometry存

    http://ziliao1.com/Article/Show/48126AB1A8F563D35E3D0345677C906B 众说周知,ArcSDE空间数据库引擎提供了两种连接数据库的方式.一是服 ...

  2. 【APUE】进程间通信之管道

    管道是UNIX系统IPC最古老形式,并且所有UNIX系统都提供此种通信机制.管道由下面两种局限性: 1)历史上,它们是半双工的(即数据只能在一个方向上流动) 2)它们只能在具有公共祖先的进程之间使用. ...

  3. java quartz的使用,做时间轮询调用 CronTrigger

    import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionExceptio ...

  4. [Node.js] Read a File in Node.js with fs.readFile and fs.readFileSync

    We'll read a csv file in node.js both synchronously, and asynchronously. The file we're reading is a ...

  5. [Angular] Communicate Between Components Using Angular Dependency Injection

    Allow more than one child component of the same type. Allow child components to be placed within the ...

  6. Java入门 第一季第五章 编程练习解析

    这是我学习慕课网Java课程的笔记.原视频链接为:http://www.imooc.com/learn/85 5-1 基本写法 自己主动补全快捷键:alt + / 5-2 输入输出 使用Scanner ...

  7. struts2 java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd

    xxx-validation.xml 文件里  java.io.FileNotFoundException: http://www.opensymphony.com/xwork/xwork-valid ...

  8. 手机阅读行业SWOT分析

    上个星期,在公司内部的分享活动上给童鞋们分享了手机阅读行业现状,小伙伴儿们嗷嗷待哺的眼神促使我把PPT转换为博客里的文字和图片,再一次更加深入地进入手机阅读. 通过SWOT分析分析我们能够对手机阅读行 ...

  9. Dom4J XML转bean

    package com.baiwang.bop.utils; import com.baiwang.bop.client.BopException; import org.dom4j.Element; ...

  10. sql server 支持中文繁体和简体

    SET ANSI_PADDING ON  INSERT INTO 表 VALUES (N'中文')