首页 > 其他分享 >CF1442D-Sum

CF1442D-Sum

时间:2023-08-25 19:55:13浏览次数:50  
标签:int CF1442D Sum long len 数组 ans dp

Sum

You are given \(n\) non-decreasing arrays of non-negative numbers.

Vasya repeats the following operation \(k\) times:

  • Selects a non-empty array.
  • Puts the first element of the selected array in his pocket.
  • Removes the first element from the selected array.

Vasya wants to maximize the sum of the elements in his pocket.

solution

1、通过微调。

首先在最终状态下,假设数组 \(a,b\) 中的元素分别被取到了 \(i,j\)(并没有取完),且 \(a_{i} \leq b_{j}\)。

由于数组内元素不降的性质,可以得知 \(a_{i-1} \leq a_{i}\),那么 \(a_{i-1}\leq b_{j}\)。

可以之前发现取 \(a_{i-1}\) 是不一定比 \(b_{j}\) 优的。

因此可以得到一条结论:在最终状态下,最多只会存在一个数组 \(x\) 被取了部分。

2、冻柜

对于其他的数组,要么不选,要么全选。

那么就可以将其转化为 \(n\) 个具有大小、价值的物品,进行 \(01\) 背包。

枚举那个被取了部分的数组 \(x\),枚举数组 \(x\) 被取出的元素的个数,时间复杂度为 \(n^2k\) 的。

3、分治优化

令 \(m = \left\lfloor\frac{l+r}{2}\right\rfloor\)。

在位于 \([l,m]\) 中的数组 \(x\),都需要来自 \((m,r]\) 的数组的 dp 值。

那么对于 \([l,m]\) 中的数组 \(x\),可以将 \((m,r]\) 的 dp 值预处理出来。

该过程可以递归操作,直到 \(l=r\) 的时候,对于第 \(l\) 个数组,需要的 dp 值是都已经求出来的。

时间复杂度降到 \(kn\log_2n\)。

code

点击查看代码
#include <bits/stdc++.h>
using namespace std;

vector<long long> a[3010];
long long dp[3010], sum[3010], len[3010], n, k;

long long DFS(int l, int r)
{
    if (l == r) {
        long long res = 0, ans = -1;
        for (int i = 0; i <= min(k, len[l]); i ++ ) {
            ans = max(ans, dp[k - i] + res);
            if (i < len[l]) res += a[l][i];
        }
        return ans;
    }
    long long f[3010], mid = (l + r) >> 1, ans = -1;
    memcpy(f, dp, sizeof(dp));

    // 对于[l,mid]的数组,预处理(mid,r]的dp值
    for (int i = mid + 1; i <= r; i ++ ) 
        for (int j = k; j >= len[i]; j -- ) 
            dp[j] = max(dp[j], dp[j - len[i]] + sum[i]);
    ans = max(ans, DFS(l, mid)); // 递归
    memcpy(dp, f, sizeof(f));
    
    for (int i = l; i <= mid; i ++ )
        for (int j = k; j > len[i]; j -- )
            dp[j] = max(dp[j], dp[j - len[i]] + sum[i]);
    ans = max(ans, DFS(mid + 1, r));
    return ans;
}

int main()
{
    scanf("%lld%lld", &n, &k);
    for (int i = 1, x; i <= n; i ++ ) {
        scanf("%lld", &len[i]);
        for (int j = 1; j <= len[i]; j ++ ) {
            scanf("%lld", &x);
            a[i].push_back(x); sum[i] += x;
        }
    }
    printf("%lld", DFS(1, n));
    return 0;
}

标签:int,CF1442D,Sum,long,len,数组,ans,dp
From: https://www.cnblogs.com/Cnghit/p/17657804.html

相关文章

  • [AGC030D] Inversion Sum
    题目大意一个长度为\(n\)的数列,然后给你\(q\)个交换或不交换操作,你可以选择操作或者不操作,问所有情况下逆序对的总和。答案需要对\(10^9+7\)取模。(\(n\leq3000\),\(q\leq3000\))。思路这道题非常巧妙。我们先考虑转化题意,求逆序对数量的期望。记\(dp_{i,j}\)表......
  • [AGC030D] Inversion Sum 题解
    题意给定一个长度为\(n\)的排列\(a\)和\(m\)个形如\(\left(x,y\right)\)的操作,每次操作可以选择是否交换\(a_x,a_y\),求最终所有形成的排列的逆序对总数。(\(1\len,m\le3000\))。题解考虑转化题意,考虑求出最终总的期望逆序对数,即CF258D。转化答案\[\text{Ans}=......
  • Commit failed (details follow): Working copy text base is corrupt Checksum misma
    问题:提交一个svn文件报错,提交其他文件没有报错解决办法:(网上看了很多方法都解决不了):1、把文件拷贝到svn目录外放着2、把svn目录下文件移除,然后commitsvn3、把目录外的文件拷贝进来,先Add,然后commit就成功了......
  • 什么是 SAP S/4HANA 的 VDM Layering Architecture 的 VDM Comsumption View
    SAPS/4HANA的VDMLayeringArchitecture的VDMConsumptionView在深入探讨"SAPS/4HANA的VDMLayeringArchitecture的VDMConsumptionView"之前,让我们逐步了解这个概念的不同组成部分。SAPS/4HANA:SAPS/4HANA是SAP的下一代企业资源计划(ERP)套件,通过内存数据库和先进的分......
  • Namomo Summer Camp 23 Day 1(GCPC2021)
    NamomoSummerCamp23Day1(GCPC2021)ProblemB:BrexitingandBrentering签到#include<bits/stdc++.h>usingi64=longlong;usingnamespacestd;typedefpair<i64,i64>PII;intmain(){ios::sync_with_stdio(false);cin.tie(nullptr)......
  • Leetcode 1. 两数之和(Two sum)
    题目链接......
  • P1466 Subset Sum
    对于从1∼n的连续整数集合,能划分成两个子集合,且保证每个集合的数字和是相等的求可以划分的方案数1.动态规划longlongmaxval(intn){intsum=(1+n)*n/2;if(sum%2==1)return0;vector<longlong>dp(sum+1)dp[0]=1;//边界方案数为1for(inti......
  • js 计算对象数组中某个字段sum之和
    1、一个字段之和要计算一个对象数组中某个字段的和,你可以使用JavaScript的Array.prototype.reduce()方法。reduce()方法对数组中的每个元素执行一个提供的函数,并将结果累积为单个值。以下是一个示例:假设你有一个对象数组 data,每个对象都有一个 value 字段,你想计算所有对......
  • leetcode-1-two sum(brute force, hash table)
    Wecanusebruteforcetogetit,usetwoforloopiandj,whichi=1:nandj=i:n.However,thetimecomplexityisO(n^2),whichisnotefficient.Usehashtable,thefirstthingisfirststoreeveryelementtotable,thendotraverseagaintolookup......
  • 20230619 java.util.IntSummaryStatistics
    介绍java.util.IntSummaryStatisticspublicclassIntSummaryStatisticsimplementsIntConsumer统计的指标:count,sum,min,average,maxAPI构造器IntSummaryStatistics()IntSummaryStatistics(longcount,intmin,intmax,longsum)publiccombinevoidcombi......