1 条题解
-
0
#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
- 上传者