• 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
  • 相关阅读:
    tomcat work 目录
    上传图片预览 支持IE8+,FF,Chrome ,保留原图片比例
    设计模式学习笔记-观察者模式
    jcarousellite 实现图片列表滚动
    linux一些常用命令
    http&https&证书&数字签名
    醉笑陪君三万场 不诉离伤
    笔记本光驱位安装固态硬盘及window系统一些过程记录
    linux 添加定时任务脚本
    设置 SSH 免密码登陆——仍提示输入密码
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/12587002.html
Copyright © 2020-2023  润新知