码迷,mamicode.com
首页 > 其他好文 > 详细

atcoder2069

时间:2019-06-30 15:37:15      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:设计   处理   去掉   gif   test   long   amp   class   typedef   

链接:https://vjudge.net/contest/308181#problem/H

题意:给了你N个数,和一个数a,让你从这N个数中选择出一些数,并使这些数的sum和是a的倍数。问你有多少种方案数。

dp的通常想法是我们先设计出状态和转移,然后根据状态和转移我们调整得到可以接受的复杂度。。。。。。。。。。

由于这个数字都不大,我们可以设计出一个n^4的做法。这样也就(50^4)的复杂度,也就(2500*2500)差不600w左右。。。。。。。。。。。。。。。。

设置状态为dp[i][j][k].表示我们从前i个数中(第i个数可以选或者不选(这个得搞清楚,选和不选是不同的。。。。。。。))选j个数的合为k的总的方案数。。。。。。。。。

然后转移的话有从当前往后转移,还有从后往前转移。。。。。。。。。。。

然后第一个纬度是可以去掉的,但是我们去掉第一个纬度之后就会出现一中情况,我们转移的时候要变成倒叙。倒序是为什么防止被覆盖。。。。。。

这个也没啥。。。。。。。。

下面是代码:

          我个人感觉的dp题目的做法:  1:你首先得知道这是一个dp题或者你能挖掘出某种通过dp来做的做法,比如一些性质和转移方式。

                                                   2:然后就是设计状态和转移方式(这是比较关键的一步)

                                                   3:接下来就是优化状态和转移方式

                                                   4:弄好了这些以后接下来可以就是怎么代码实现。比如倒序实现,初始值处理,最后需要的值,有那些冗余的值是不需要更新的。。。。。。。。。。。。。。

接下来是代码:

                     

技术图片
 1 #include <algorithm>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <bitset>
 7 typedef long long ll;
 8 using namespace std;
 9 int n,a;
10 ll dp[52][52][2555];
11 int num[55];
12 int main(){
13     scanf("%d%d",&n,&a);
14     for(int i=1;i<=n;i++) scanf("%d",&num[i]);
15     dp[1][1][num[1]]=1;
16     dp[1][0][0]=1;
17     //从前1个中选1 或者选0个的都为1
18     //其他没有的都设置成0就行了,也不会参与更新。。。。。。。。。。。。。。。
19     for(int i=2;i<=n;i++){
20         dp[i][1][num[i]]++;
21         //这个只能用++ ,应该还是能懂的
22         for(int j=1;j<=i;j++){
23             for(int k=1;k<=(i*50);k++){
24                 dp[i][j][k]+=dp[i-1][j][k];
25                 //表示第i个没选  
26                 dp[i][j][num[i]+k]+=dp[i-1][j-1][k];
27                 //表示第i个选了
28                 //这个应该在转移设计里面就想好的。。。。。。。。
29                 
30             }
31         }
32     }
33     ll ans=0;
34     for(int i=1;i<=n;i++){
35         ans+=dp[n][i][i*a];
36         //最后算答案的贡献。。。。。。。
37     }
38     printf("%lld\n",ans);
39     
40     return 0;
41 }
View Code

 

                  

 

atcoder2069

标签:设计   处理   去掉   gif   test   long   amp   class   typedef   

原文地址:https://www.cnblogs.com/pandaking/p/11109984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!