zoukankan      html  css  js  c++  java
  • 【7.24校内交流赛】T3【qbxt】复读警告

    数据范围: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-

  • 相关阅读:
    Git 简要教程
    SDK更新失败问题解决
    常用安卓操作
    MongoDB本地安装与启用(windows 7/10)
    windows 快捷键收集
    windows 常用命令
    Lambda Expression Introduction
    对 load_breast_cancer 进行 SVM 分类
    Support Vector Machine
    使用 ID3 对 Titanic 进行决策树分类
  • 原文地址:https://www.cnblogs.com/zhuier-xquan/p/11237067.html
Copyright © 2011-2022 走看看