1 条题解

  • 0
    @ 2026-1-27 19:09:40
    #include<bits/stdc++.h>
    using namespace std;
    
    int t,n;               // [1] t-测试用例的数量;n-每组数据中的店铺数量
    int arr[100100];       // [2] arr数组-存储每家店铺的现金数量(下标从1开始,对应第1到第n家店)
    int dp[100100];        // [3] dp数组-动态规划数组,dp[i]表示前i家店铺中,在不触发警报的情况下能获得的最大现金
    
    int main(){
    	cin>>t;  // [4] 读取测试用例的数量
    	while(t--){  // [5] 循环处理每一组测试用例
    		cin>>n;  // [6] 读取当前测试用例的店铺数量n
    		for(int i=1;i<=n;i++) cin>>arr[i];  // [7] 读取每家店铺的现金数量,存入arr数组(下标1对应第1家店)
    		
    		/*
    		问题分析:不能抢劫相邻的两家店,否则触发警报。
    		对第i家店有两种选择:
    		(1) 不抢劫第i家:此时最大收益等于前i-1家店的最大收益(dp[i-1])
    		(2) 抢劫第i家:此时不能抢劫第i-1家,最大收益等于前i-2家店的最大收益 + 第i家店的现金(dp[i-2] + arr[i])
    		*/
    		memset(dp,-1,sizeof(dp));  // [8] 初始化dp数组为-1,确保未计算的状态有明确初始值
    		dp[0]=0;  // [9] 边界条件:前0家店(没有店铺)的收益为0
    		
    		// 动态规划状态转移
    		for(int i=1;i<=n;i++){
    			// 对于第1家店,i-2 = -1,所以dp[i-2]视为0(没有前-1家店)
    			if(i == 1){
    				dp[i] = max(dp[i-1], arr[i]);
    			}else{
    				dp[i] = max(dp[i-1], dp[i-2] + arr[i]);  // [10] 状态转移方程:取两种选择的最大值
    			}
    		}
    		cout<<dp[n]<<endl;  // [11] 输出前n家店的最大收益(即当前测试用例的答案)
    	}
    	return 0;                  
    }
    
    • 1

    信息

    ID
    1322
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    2
    上传者