题目链接:https://atcoder.jp/contests/abc159/tasks/abc159_f
题目大意
给定一个长度为 $N$ 的数组 $A$ 和一个正整数 $S$ ,定义 $f(L, R)$ 为数组区间 $[L, R]$ 中子序列和为 $S$ 的子序列个数,求 $sum^N_{L=1}sum^N_{R=L}f(L,R)$.
分析
枚举右端点,进行$DP$即可,详细见代码注释.
代码如下
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 /*-------------------Define Start-------------------*/ 5 typedef bool BL; // 布尔类型 6 typedef char SB; // 有符号1字节,8位 7 typedef unsigned char UB; // 无符号1字节,8位 8 typedef short SW; // 有符号短整型,16位 9 typedef unsigned short UW; // 无符号短整型,16位 10 typedef long SDW; // 有符号整型,32位 11 typedef unsigned long UDW; // 无符号整型,32位 12 typedef long long SLL; // 有符号长整型,64位 13 typedef unsigned long long ULL; // 无符号长整型,64位 14 typedef char CH; // 单个字符 15 typedef float R32; // 单精度浮点数 16 typedef double R64; // 双精度浮点数 17 18 #define Rep(i, n) for (register SDW i = 0; i < (n); ++i) 19 #define For(i, s, t) for (register SDW i = (s); i <= (t); ++i) 20 #define rFor(i, t, s) for (register SDW i = (t); i >= (s); --i) 21 #define foreach(i, c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 22 #define ms0(a) memset(a,0,sizeof(a)) 23 #define msI(a) memset(a,0x7f,sizeof(a)) 24 #define LOWBIT(x) ((x)&(-x)) 25 26 #define MP make_pair 27 #define PB push_back 28 #define ft first 29 #define sd second 30 31 #define pr(x) cout << #x << " = " << x << " " 32 #define prln(x) cout << #x << " = " << x << endl 33 34 const ULL mod = 998244353; //常用模数(可根据题目需要修改) 35 const ULL inf = 0x7fffffff; //用来表示无限大 36 const ULL infLL = 0x7fffffffffffffffLL; //用来表示无限大 37 /*-------------------Define End-------------------*/ 38 39 const UDW maxN = 3e3 + 7; 40 SDW N, S; 41 SDW A[maxN]; 42 SLL dp[maxN]; // dp[i][j] 表示当 R == i 时,和为 j 的序列个数 43 SLL ans; 44 45 void input(){ 46 cin >> N >> S; 47 For(i, 1, N) { 48 cin >> A[i]; 49 } 50 } 51 52 void solve(){ 53 For(i, 1, N) { 54 rFor(j, S, A[i]) { 55 // 更新,不选和选两种情况 56 dp[j] = (dp[j] + dp[j - A[i]]) % mod; 57 } 58 if(A[i] <= S) { 59 dp[A[i]] = (dp[A[i]] + i) % mod; // j == A[i]的情况需要特殊讨论 60 } 61 ans = (ans + dp[S]) % mod; 62 } 63 } 64 65 void output(){ 66 cout << ans << endl; 67 } 68 69 int main() { 70 input(); 71 solve(); 72 output(); 73 return 0; 74 }