ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Codeforces Round #750 (Div. 2) E. Pchelyonok and Segments (dp)

2021-10-27 11:02:16  阅读:198  来源: 互联网

标签:Pchelyonok 750 int Segments sum 区间 ll dp define


  • 题意:长度为\(n\)的数组,确定一个数\(k\),然后连续选\(k,k-1,...,2,1\)个不相交的区间,并且满足区间\(sum\)和严格递增,问你\(k\)的最大取值。

  • 题解:我们从后往前遍历,设\(dp[k][i]\)表示当前位置为\(i\),选择区间长为\(k\)的\([i,n]\)中的最大取值,因为我们要求区间是严格递增的,所以取最大最优,那么如果不选当前这个区间,则:\(dp[k][i]=max(dp[k][i+1],...,dp[k][n-k+1])\),如果选择当前这个区间,我们要先判断一下当前区间和是否小于\(dp[k-1][i+k]\),然后再维护最大值:\(dp[k][i]=max(dp[k][i],sum[i+k-1]-sum[i-1])\).

    最后还要注意\(dp\)数组的初始值。卡了我好久(

  • 代码

    #include <bits/stdc++.h>
    #define ll long long
    #define fi first
    #define se second
    #define pb push_back
    #define me memset
    #define rep(a,b,c) for(int a=b;a<=c;++a)
    #define per(a,b,c) for(int a=b;a>=c;--a)
    const int N = 1e6 + 10;
    const int mod = 1e9 + 7;
    const int INF = 0x3f3f3f3f;
    using namespace std;
    typedef pair<int,int> PII;
    typedef pair<ll,ll> PLL;
    ll gcd(ll a,ll b) {return b?gcd(b,a%b):a;}
    ll lcm(ll a,ll b) {return a/gcd(a,b)*b;}
    
    ll dp[501][100010];
    
    int main() {
    	int _;
    	scanf("%d",&_);
    	while(_--){
    		int n;
    		scanf("%d",&n);
    		for(int k=1;k<=500;++k){
    			for(int i=1;i<=n+1;++i){
    				dp[k][i]=0;
    			}
    		}
    		vector<int> a(n+1);
    		vector<ll> sum(n+1);
    		for(int i=1;i<=n;++i){
    			scanf("%d",&a[i]);
    			sum[i]=sum[i-1]+a[i];
    		}
    		for(int i=1;i<=n+1;++i){
    			dp[0][i]=INF;
    		}
    		for(int i=n;i>=1;--i){
    			for(int k=1;k<=500;++k){
    				dp[k][i]=dp[k][i+1];
    				if(i+k-1<=n && sum[i+k-1]-sum[i-1]<dp[k-1][i+k]){
    					dp[k][i]=max(dp[k][i],sum[i+k-1]-sum[i-1]);
    				}
    			}
    		}
    		int ans;
    		for(int i=500;i>=1;--i){
    			if(dp[i][1]){
    				ans=i;
    				break;
    			}
    		}
    		printf("%d\n",ans);
    	}
        return 0;
    }
    

标签:Pchelyonok,750,int,Segments,sum,区间,ll,dp,define
来源: https://www.cnblogs.com/lr599909928/p/15469506.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有