zoukankan      html  css  js  c++  java
  • 【题解】[USACO03FALL]Cow Exhibition G

    题目戳我

    ( ext{Solution:})

    考虑(dp,)(dp[i][j])表示前(i)个物品智商为(j)的情商最大值。

    先考虑负数情况,可以整体挪动一个最大值,更改状态为前(i)个物品智商为(j+Mx)的情商最大值。

    那么有显然(dp)方程:(dp[i][j]=maxleft{dp[i-1][j],dp[i-1][j-iq[i]]+eq[i] ight})

    时间复杂度为(O(n*Mx))不被接受。

    考虑更改状态:(dp[j])表示智商为(j+Mx)的情商最大值。

    (dp[j]=maxleft{dp[j-iq[i]]+eq[i] ight})

    考虑转移顺序:当(iqin Z^*)时,一定从小的(j)转移到大的(j),故需要倒序枚举(j,)而当(iq)为负数时,为了保证一定从上一层状态转移而来,需要正序枚举(j).

    最后的答案就是(maxleft{dp[j]+j-Mx ight})

    #include<bits/stdc++.h>
    using namespace std;
    const int MAXN=500;
    int MR=4e5;
    int eq[MAXN],iq[MAXN],n,dp[800001];
    int main(){
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d%d",&iq[i],&eq[i]);
    	}
    	memset(dp,-0x3f,sizeof(dp));
    	dp[MR]=0;
    	MR<<=1;
    	//dp[i]表示智商为i+400000的情商最大值 
    	for(int i=1;i<=n;++i){
    		if(iq[i]>=0){
    			for(int j=MR;j>=iq[i];--j)
    				dp[j]=max(dp[j],dp[j-iq[i]]+eq[i]);
    			//若iq为正数,则转移会从小的转移到大的,所以顺序逆序 
    		}
    		else{
    			for(int j=0;j<=MR+iq[i];++j)
    				dp[j]=max(dp[j],dp[j-iq[i]]+eq[i]);
    			//若iq为负数,则转移会从大的转移到小的,所以先利用上一层的状态来更新这一层状态
    			//故顺序为逆序 
    		}
    	}
    	int ans=0;
    	for(int i=400000;i<=MR;++i){
    		if(dp[i]>=0)ans=max(ans,dp[i]+i-400000);
    	}
    	printf("%d
    ",ans);
    	return 0;
    } 
    
  • 相关阅读:
    百度ECharts数据绑定诀窍
    SQL操作Json数据
    c# 如何得到一个字符的ASCII码
    Sql数据库收缩 语句特别快
    Hive中 使用 Round() 的坑
    [转]Hive 数据类型
    [转] Hive函数大全
    使用Hive Rest API 连接HDInsight
    Hive动态分区 参数配置及语法
    Js的引用赋值与传值赋值
  • 原文地址:https://www.cnblogs.com/h-lka/p/13821813.html
Copyright © 2011-2022 走看看