C++ 优化:动态规划解决最大权重问题
C++ 优化:动态规划解决最大权重问题
本文介绍了一种使用 C++ 和动态规划解决最大权重问题的方法,并使用 #pragma GCC optimize 进行优化,以提高代码效率。
代码示例
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
using namespace std;
inline static const nullptr_t _=[](){
ios_base::sync_with_stdio(0);
cin.tie(nullptr),cout.tie(nullptr);
return nullptr;
}();
int n,ans;
int main(){
cin>>n;
vector<int> w(n),a(n);
for(int i=0;i<n;i++) cin>>w[i];
for(int i=0;i<n;i++) cin>>a[i];
vector<int> dp=w;
for(int i=0;i<n;i++){
for(int j=0;j<i;j++) if(!((i-j)%a[j])) dp[i]=max(w[i]+dp[j],dp[i]);
ans=max(ans,dp[i]);
}
cout<<ans<<'\n';
return 0;
}//转换成Groovy内容:import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
ArrayList<Integer> w = new ArrayList<>();
ArrayList<Integer> a = new ArrayList<>();
for(int i=0; i<n; i++) {
w.add(input.nextInt());
}
for(int i=0; i<n; i++) {
a.add(input.nextInt());
}
ArrayList<Integer> dp = new ArrayList<>(w);
int ans = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<i; j++) {
if((i-j)%a.get(j) == 0) {
dp.set(i, Math.max(w.get(i) + dp.get(j), dp.get(i)));
}
}
ans = Math.max(ans, dp.get(i));
}
System.out.println(ans);
}
}
代码优化
代码中使用了 #pragma GCC optimize 指令来优化编译器生成的代码。具体优化选项如下:
- #pragma GCC optimize(1):开启基本的优化选项。
- #pragma GCC optimize(2):开启更高级的优化选项。
- #pragma GCC optimize(3,"Ofast","inline"):开启最高级别的优化选项,包括 -Ofast 和 -finline-functions。
此外,代码还使用了以下优化技巧:
- ios_base::sync_with_stdio(0):关闭 C++ 的标准输入输出流与 C 库的同步,以提高输入输出效率。
- cin.tie(nullptr),cout.tie(nullptr):取消 cin 和 cout 的绑定,以提高输入输出效率。
- inline:使用 inline 关键字声明函数,以提高函数调用效率。
问题描述
该代码解决的是一个最大权重问题。给定一个大小为 n 的数组 w 和一个大小为 n 的数组 a,要求找到一个最大权重的子序列,满足以下条件:
- 子序列中元素的索引必须是递增的。
- 对于子序列中的任意两个元素 i 和 j (i < j),必须满足 (i - j) % a[j] == 0。
代码解释
代码使用动态规划的方法来解决问题。dp[i] 表示以 i 结尾的最大权重子序列的权重。状态转移方程为:
dp[i] = max(w[i] + dp[j], dp[i])
其中,j 是满足 (i - j) % a[j] == 0 的所有索引。最后,ans 表示所有 dp[i] 的最大值,即最大权重子序列的权重。
总结
本文介绍了一种使用 C++ 和动态规划解决最大权重问题的方法,并使用 #pragma GCC optimize 进行优化,以提高代码效率。希望本文能够帮助读者更好地理解动态规划算法,并学习使用 #pragma GCC optimize 指令进行代码优化。
原文地址: https://www.cveoy.top/t/topic/p21t 著作权归作者所有。请勿转载和采集!