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&lt;n; i++) {
        w.add(input.nextInt());
    }
    
    for(int i=0; i&lt;n; i++) {
        a.add(input.nextInt());
    }
    
    ArrayList&lt;Integer&gt; dp = new ArrayList&lt;&gt;(w);
    int ans = 0;
    
    for(int i=0; i&lt;n; i++) {
        for(int j=0; j&lt;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 指令进行代码优化。

C++ 优化:动态规划解决最大权重问题

原文地址: https://www.cveoy.top/t/topic/p21t 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录