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

【7.24校内交流赛】T3【qbxt】复读警告

时间:2019-07-24 13:23:10      阅读:85      评论:0      收藏:0      [点我收藏+]

标签:include   ast   png   style   mamicode   ++   i++   etc   key   

技术图片

数据范围:N,key<=1000;

首先看题目背景,显然不是DP就是图论,但是这显然不是个图论,因此这就是个DP;

接下来考虑怎么DP

我们定义dp[i][j]表示现在dp到了第i个数,当前i个数%key=j的方案数;

最后答案就是dp[n][0];

考虑转移:

当我们希望求出前i个数中的某几个数相加%key=j的方案数时,我们有两种选择:

1.选择第i个数,那么我们先要求出选第i个数之前%key=?:

int t=j-a[i]%key;
            if(t<0) 
                t+=key;

然后dp[i][j]+=dp[i-1][t]

2.不选择第i个数,直接dp[i][j]+=dp[i-1][j];

然后输出dp[n][0]就好了;

#include<bits/stdc++.h>
#define mod 1000000007

using namespace std;

inline int read(){
    int ans=0;
    char last= ,ch=getchar();
    while(ch>9||ch<0) last=ch,ch=getchar();
    while(ch>=0&&ch<=9) ans=(ans<<1)+(ans<<3)+ch-0,ch=getchar();
    if(last==-) ans=-ans;
    return ans;
}

int n,key;
int a[1010];
int dp[1010][1010];

int main(){
    n=read();key=read();
    for(int i=1;i<=n;i++) a[i]=read();
    dp[0][0]=1;
    for(int i=1;i<=n;i++){
        for(int j=0;j<key;j++){
            int t=j-a[i]%key;
            if(t<0) 
                t+=key;
            dp[i][j]=(dp[i-1][t]+dp[i-1][j])%mod;
        }
    }
    printf("%d",dp[n][0]%mod);
    return 0;
} 

end-

【7.24校内交流赛】T3【qbxt】复读警告

标签:include   ast   png   style   mamicode   ++   i++   etc   key   

原文地址:https://www.cnblogs.com/zhuier-xquan/p/11237067.html

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