3 条题解

  • 0
    @ 2025-5-7 13:08:37

    #include <iostream>

    using namespace std;

    int n;//n个申请

    int get[100005];//接受的收益

    int giveup[100005];//需要放弃的个数

    int dp[100005];//到第i个申请时,此时可收益的最大值

    int main() { cin>>n;

    for(int i=1;i<=n;i++){
    	cin>>get[i];
    	cin>>giveup[i];	
    }
    
    dp[1]=get[1];
    
    for(int i=1;i<=n;i++){
    	
    	dp[i]=max(dp[i],dp[i-1]);
    	
    	if(i+giveup[i]<=n)//接受第i+giveup个,且不越界 
    	{
    	int rec=dp[i]+get[i];//新的dp[i+giveup[i]],用rec记录			
    	dp[i+giveup[i]]=max(dp[i+giveup[i]],rec); 
    	
    	}
    	 
    } 
    
    cout<<dp[n];
    
    
    return 0;
    

    }

    • 0
      @ 2025-4-8 19:13:00
      #include<bits/stdc++.h>
      using namespace std;
      #define int long long
      const int inf=1e7+10;
      int n,dp[inf],a[inf],b[inf];
      signed main(){
      	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
      	cin>>n;
      	for(int i=1;i<=n;i++)cin>>a[i]>>b[i];
      	for(int i=n;i>=1;i--){
      		dp[i]=max(dp[i+1],dp[i+b[i]+1]+a[i]);
      		//cout<<i<<":"<<dp[i]<<endl; 
      	}
      	cout<<dp[1];
      	return 0;
      }
      
      • 0
        @ 2024-4-8 19:00:42
        n = int(input())
        ls = [0]*(n+5)
        for i in range(n):
            a,b = map(int,input().split())
            ls[i] = [a,b]
        
        dp = [0]*(n+5)
        
        for i in range(n-1,-1,-1):
            dp[i] = dp[i+1]
            c = i + ls[i][1]+1
            dp[i] = max(dp[i],ls[i][0]+(dp[c] if c<n else 0 ))
        
        print(max(dp))
        
        • 1

        信息

        ID
        127
        时间
        1000ms
        内存
        256MiB
        难度
        7
        标签
        递交数
        657
        已通过
        135
        上传者