- C++
经历一个上午 我终于搞懂动态规划了
- 2024-10-25 14:51:28 @
找AI问的题目(好像是leetcode上的):
题目名称:打家劫舍
题目描述: 你是一个职业强盗,打算沿街打劫房屋。每间房子都固定金钱数量,但是相邻的房子有防盗系统,如果两间相邻的房子在同一晚上被强盗闯入,系统会自动报警。
目标: 计算在不触动警报的情况下,一夜之内能够偷窃到的最多金额。
输入格式: 第一行包含一个整数 n,表示房屋的数量。 第二行包含 n 个整数,表示每个房屋存放的金额。
输出格式: 一个整数,表示能够偷窃到的最多金额。
约束条件: 1 <= n <= 100 每个房屋存放的金额在 1 到 1000 之间。
输入:
5
1 2 3 1 2
输出:
6
解析: 在偷1 3 5号房子时能偷到最多钱
代码(自编 性能没有AI的好 但是能用):
#include<stdio.h>
#include<vector>
using namespace std;
int n;
vector <int> money;
int max_money() {
vector <int> dp(n, 0);
dp[0] = money[0],dp[1] = money[1];
for(int i = 2; i < n; ++i){
for(int t = 1; t < i; ++t){
dp[i] = max(dp[t], dp[i - 2] + money[i]);
}
}
return dp[n - 1];
}
int main() {
scanf("%d",&n);
for(int i = 0; i < n; ++i) {
int r;
scanf("%d",&r);
money.push_back(r);
}
printf("%d",max_money());
return 0;
}
AI代码:
#include <iostream>
#include <vector>
#include <algorithm> // For std::max
using namespace std;
void rob(vector<int>& nums) {
int n = nums.size();
if (n == 0) {cout << 0;return;}
if (n == 1) {cout << nums[0];return;}
vector<int> dp(n, 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
for (int i = 2; i < n; i++) {
dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
}
cout << dp[n-1];
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
rob(nums);
return 0;
}
注释: max和min函数严格意义上是定义在algobase库里的 而vector库包含了这个库 因此其实并不需要导入algorithm库
2 comments
-
蔡徐坤 LV 9 MOD @ 2024-10-30 17:58:11
菜就多练
🤡 1🍋 1 -
2024-10-25 21:19:11@
加油,我没上
- 1