AtCoder ABC 159F Knapsack for All Segments

题目链接: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 }
View Code

 

posted @ 2020-03-28 13:29  梦樱羽  阅读(225)  评论(0编辑  收藏  举报
Live2D