7.24校内交流赛T3qbxt复读警告
Posted zhuier-xquan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7.24校内交流赛T3qbxt复读警告相关的知识,希望对你有一定的参考价值。
数据范围: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校内交流赛T3qbxt复读警告的主要内容,如果未能解决你的问题,请参考以下文章