HDU 5389 Zero Escape
题意:有一些人,每人拿一个号码,有两个门,门的值分别为A和B,要求把人分成两堆(可以为空)一堆人手持号码之和的数字根若等于A或者B就可以进入A门或者B门,要求两堆人分别进入不同的门,求有几种分配方式,如果A和B的值相等则算两种。
解法:dp。比赛的时候并不知道一个数%9+1就是数字根……煞费苦心的算了半天……只得出结论a+b的数字根等于a的数字根+b的数字根的数字根……没打表……于是T了……然后打了个表才过orz
设dp[i][j]表示用前i个人获得数字根为j的和的方案数,打一个表vector<int> tab[i][j]表示和j相加的数字根等于i的数。则可以得到方程dp[i][j] = dp[i - 1][j] + ∑dp[i - 1][tab[j][a[i]][k]],dp[i - 1][j]表示不选第i个数,后面的和表示选第i个数时可以转移来的所有状态之和。
答案即为dp[n][A],但是当A和B相等时,多出一种A选0个人的方案,需要特判。
代码:
因为一开始没想到上面那个特判……想了好多乱七八糟的特判= =代码好乱……【无视无视
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <limits.h>
using namespace std;
typedef long long LL;
const LL mod = 258280327;
int t, n, A, B;
int get_num(int x)
{
int tmp = x;
while(tmp >= 10)
{
x = tmp;
tmp = 0;
while(x)
{
tmp += x % 10;
x /= 10;
}
}
return tmp;
}
vector <int> tab[10][10];
void init()
{
for(int i = 1; i <= 9; i++)
for(int j = 1; j <= 9; j++)
for(int k = 0; k <= 9; k++)
{
if(get_num(k + j) == i)
tab[i][j].push_back(k);
}
}
LL dp[100005][11];
LL a[100005];
int main()
{
init();
scanf("%d", &t);
while(t--)
{
scanf("%d%d%d", &n, &A, &B);
memset(dp, 0, sizeof dp);
LL sum = 0;
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
sum += a[i];
}
for(int i = 0; i <= n; i++)
dp[i][0] = 1;
LL ans = 0;
int tmp = get_num(sum);
if(tmp != get_num(A + B))
{
if(tmp == A && tmp == B)
{
printf("2\n");
continue;
}
else if(tmp == A)
{
printf("1\n");
continue;
}
else if(tmp == B)
{
printf("1Zn");
continue;
}
else
{
printf("0\n");
continue;
}
}
if(sum == A)
{
if(sum == B)
{
printf("2\n");
continue;
}
else
{
printf("1\n");
continue;
}
}
else if(sum == B)
{
printf("1\n");
continue;
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= 9; j++)
{
dp[i][j] += dp[i - 1][j];
int len = tab[j][a[i]].size();
for(int k = 0; k < len; k++)
{
dp[i][j] += dp[i - 1][tab[j][a[i]][k]];
if(dp[i][j] > mod)
dp[i][j] -= mod;
}
}
}
ans = dp[n][A];
if(get_num(sum) == B)
ans++;
printf("%lld\n", ans);
}
return 0;
}
HDU 5389 Zero Escape的更多相关文章
- HDU 5389 Zero Escape(dp啊 多校)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5389 Problem Description Zero Escape, is a visual no ...
- hdu 5389 Zero Escape (dp)
题目:http://acm.hdu.edu.cn/showproblem.php? pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②反复①直到得到的数仅仅有1位.给定n,A ...
- HDU 5389 Zero Escape(DP + 滚动数组)
Zero Escape Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) To ...
- hdu 5389 Zero Escape(记忆化搜索)
Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi ...
- 2015 Multi-University Training Contest 8 hdu 5389 Zero Escape
Zero Escape Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- HDU 5389 Zero Escape (MUT#8 dp优化)
[题目链接]:pid=5389">click here~~ [题目大意]: 题意: 给出n个人的id,有两个门,每一个门有一个标号,我们记作a和b,如今我们要将n个人分成两组,进入两个 ...
- 递推DP HDOJ 5389 Zero Escape
题目传送门 /* 题意:把N个数分成两组,一组加起来是A,一组加起来是B,1<=A,B<=9,也可以全分到同一组.其中加是按照他给的规则加,就是一位一位加,超过一位数了再拆分成一位一位加. ...
- hdoj 5389 Zero Escape
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 大体题意是:有两个门A和B,还有一群人,每个人都有一个数字, 疯了一样的T..比赛的时候十连T也 ...
- HDU 3605:Escape(最大流+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...
随机推荐
- Chp4: Trees and Graphs
1.Type of Tree 1. Binary Tree: a binary tree is a tree in which each node has at most two child node ...
- C#的cs文件中Response.Clear();Response.ClearHeaders()的作用
在学习一个CS文件,如下:public partial class GetPic : System.Web.UI.Page{ protected void Page_Load(object se ...
- hdu 1134 Game of Connections
主要考察卡特兰数,大数乘法,除法…… 链接http://acm.hdu.edu.cn/showproblem.php?pid=1134 #include<iostream>#include ...
- http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html
http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html http://www.cnblogs.com/langtianya/a ...
- Java传入参数个数不确定可用(Type ... values)
/** * 可变长的参数. * 有时候,我们传入到方法的参数的个数是不固定的,为了解决这个问题,我们一般采用下面的方法: * 1. 重载,多重载几个方法,尽可能的满足参数的个数.显然这不是什么好办法. ...
- lintcode:Remove Nth Node From End of Lis 删除链表中倒数第n个节点
题目: 删除链表中倒数第n个节点 给定一个链表,删除链表中倒数第n个节点,返回链表的头节点. 样例 给出链表1->2->3->4->5->null和 n = 2. 删除 ...
- Java学习笔记之:Java 接口
一.引言 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是类 ...
- Java API —— IO流( FileInputStream & FileOutputStream & BufferedInputStream & BufferedOutputStream )
1.IO流概述 · IO流用来处理设备之间的数据传输 · 上传文件和下载文件 · Java对数据的操作是通过流的方式 · Java用于操作流的对象都在IO包中 2.IO ...
- MongoDB安装及简单实验
1.Windows下安装MongoDB http://www.mongodb.org/downloads 下载msi,下一步下一步… 安装完毕后,到安装目录的bin目录下执行mongod启动数据库服务 ...
- vi 编辑内容中查找字符位置
[root@localhost gdm]# vi /etc/X11/gdm/gdm.conf # You can also use the gdm-restart and gdm-safe-resta ...