hdoj 5389 Zero Escape

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389

大体题意是:有两个门A和B,还有一群人,每个人都有一个数字,

疯了一样的T。。比赛的时候十连T也是醉醉的。  

这道题感觉像DP,但是不知道从何下手,看别人敲出来才知道怎么去用。

在比赛过程中还有一个问题,想法对了,样例过了,但是T了

原因是因为数组开大了,在dp的过程中用了memset,导致T

在标程里,用了滚动数组,感觉很巧妙,因为dp只需要知道上一状态即可,

利用异或的性质,不断滚动0101010101

---------------------------------------关于digital的性质------------------------------------------------------------

当一群人各位数字之和等于门上数字的时候才可以通过门,可以只通过一个门也可以两个门都通过。

The digital root of a non-negative integer is the single digit value obtained by an iterative process of summing digits,

on each iteration using the result from the previous iteration to compute a digit sum. The process continues until

a single-digit number is reached.

关于digital root(以下用R表示),有以下几条性质:

1、9加(乘)任何数所得的和(积)的数字根,等于原数的数字根(9)

2、若A+B=C,则A,B的数字根(Ra Rb)的和的数字根为C的数字根(Rc)

3、若A*B=C,则A,B的数字根(Ra Rb)的积的数字根为C的数字根(Rc)

4、若A^n=B,则Ra^n的数字跟=Rb。

------------------DP思路---------------------

dp[i+1][a[i]+k] = dp[i+1][a[i]+k] + dp[i][k];

更新加了一个数之后的状态

dp[i+1][k] = dp[i+1][k] + dp[i][k];

加上上一状态的情况数

------------------分情况讨论-------------------

之后比较巧的是对于情况的讨论

1、如果数字跟不等于A+B且不等于A且不等于B,则情况数为0

2、如果是数字根等于A+B的数字根,那么情况数就等于dp[n][A] = dp[n][B]

3、如果数字根等于A或B,那么情况数只有一个

4、如果数字跟等于A且等于B,那么情况数有两个

具体代码如下

1         int ans=dp[now][A]*(((A+B)%9)==sum);
2         if(sum==A&&B!=0)ans=(ans+1)%MOD;
3         if(sum==B&&A!=0)ans=(ans+1)%MOD;

注意到后两种情况其实可以合并,如果A=B的话,后两个if语句同时成立,ans = 2;

 1 #include<stdio.h>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define rep(i,j,k) for(int i=(int)j;i<(int)k;i++)
 5 #define per(i,j,k) for(int i=(int)j;i>(int)k;i--)
 6 using namespace std;
 7 const int MAXN = 1000000;
 8 const int MOD = 258280327;
 9 int T, n;
10 int A, B;
11 int a[MAXN];
12 int now, sum, ans;
13 int dp[2][10];
14 int main(){
15     scanf("%d",&T);
16     while(T--){
17         scanf("%d",&n);
18         scanf("%d %d",&A,&B);
19         A %= 9;B %= 9;
20         sum = 0;
21         rep(i,0,n){
22             scanf("%d",&a[i]);
23             a[i] = a[i] % 9;
24             sum = (sum+a[i])%9;
25         }
26         if( sum != ((A+B)%9) && sum != A && sum != B){
27             puts("0");
28             continue;
29         }
30         memset(dp,0,sizeof(dp));
31         dp[0][0] = 1;
32         now = 0;
33         rep(i,0,n){
34             now ^= 1;
35             rep(k,0,9) dp[now][k] = 0;
36             rep(k,0,9){
37                 dp[now][(a[i]+k)%9] = ( dp[now][(a[i]+k)%9] + dp[now^1][k])%MOD;
38                 dp[now][k] = ( dp[now][k] + dp[now^1][k])%MOD;
39             }
40         }
41         int ans=dp[now][A]*(((A+B)%9)==sum);
42         if(sum==A&&B!=0)ans=(ans+1)%MOD;
43         if(sum==B&&A!=0)ans=(ans+1)%MOD;
44         printf("%d\n",ans);
45     }
46 }
时间: 2024-10-10 23:23:04

hdoj 5389 Zero Escape的相关文章

递推DP HDOJ 5389 Zero Escape

题目传送门 1 /* 2 题意:把N个数分成两组,一组加起来是A,一组加起来是B,1<=A,B<=9,也可以全分到同一组.其中加是按照他给的规则加,就是一位一位加,超过一位数了再拆分成一位一位加. 3 DP:dp[i][j]记录前i个数累加和为j的方案数,那么状态转移方程:dp[i][j+a[i]] += dp[i-1][j]; 当然,dp[i][a[i]] = 1; 4 然后考虑几种特殊情况:都前往S1门或S2门,方案数+1.另外,比赛时我写出正确的转移方程,结果答案输出dp[n][s1]+

HDOJ 5389 Zero Escape DP

一个数的数字根只和它mod~9mod 9之后的值有关,只要类似背包就能完成人员分配的计算. 具体证明:数字根=\sum_{i=0}^{w}a_i∑?i=0?w??a?i??,数字=\sum_{i=0}^{w}10^i*a_i∑?i=0?w??10?i???a?i?? 数字-数字根=\sum_{i=0}^{w}(10^i-1)*a_i∑?i=0?w??(10?i???1)?a?i??,这个数字在modmod 99域下为00 Zero Escape Time Limit: 2000/1000 MS

【HDOJ】2364 Escape

bfs.题目做的不细心,好多小错误.尤其注意起始点就是边界的情况.wa了八次. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 using namespace std; 6 7 #define MAXN 85 8 9 typedef struct node_st { 10 int x, y; 11 int d, s; 12 node_st(

HDU 5389 Zero Escape(dp啊 多校啊 )

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter of

hdu 5389 Zero Escape

传送门 Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 1460    Accepted Submission(s): 716 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro U

HDU 5389 Zero Escape(dp啊 多校)

题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5389 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchikoshi (you may hear about ever17?) and developed by Chunsoft. Stilwell is enjoying the first chapter o

HDU 5389 Zero Escape(dp解法)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5389 题面: Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 164    Accepted Submission(s): 73 Problem Description Zero Escape, is a vis

HDU 5389 Zero Escape (类0/1背包)

Zero Escape Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 452 Problem Description Zero Escape, is a visual novel adventure video game directed by Kotaro Uchik

hdu 5389 Zero Escape (dp)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5389 题意:定义数根:①把每一位上的数字加起来得到一个新的数,②重复①直到得到的数只有1位.给定n,A,B和n个一位数,求把这n个数分成两部分,使得这两部分的其中一部分的和的数根等于A另外一部分的和的数根等于B的方案数. 分析:一个数a的数根s=(a-1)%9+1,为了方便直接用s=a%9,其中0代表9.定义dp[i][j]表示前i个数中数根为j的方案数.对于第i个数可以选也可以不选,那么状态转移方程为