兜兜零元 发表于 2024-12-30 01:00:06

GXUOJ-算法-第二次作业

1.矩阵连(链)乘

题目描述

GXUOJ | 矩阵连乘
https://i-blog.csdnimg.cn/direct/c4e65c5357f34478a6309eae5aa4fa51.png
代码解答

#include<bits/stdc++.h>
using namespace std;

const int N=50;
int m;
int p;
int n;

int main(){
        cin>>n;
       
    //m 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小计算次数。
        for(int i=0;i<=n;i++){
                cin>>p;
                m=0;
        }
       
        for(int r=2;r<=n;r++){
                for(int i=1;i<=n-r+1;i++){
                       
                       
                        int j=r+i-1;
                        //初始化, m 相当于 Ai,Ai+1···Aj 的最小乘积,       
                        //m是A【i+1]到A的最小乘积
                        m=m+p*p*p;

                        //k=i+1/ik<=j/k<j 四个结合都没有影响
                        for(int k=i+1;k<j;k++){
                                int t=m+m+p*p*p;
                                if(t<m)
                                        m=t;
                        }
                }
        }
        cout<<m;
} 解题思绪

   i代表开始的下标,j代表结束的下标,r代表矩阵的长度。
m 存储的是从第 i 个矩阵到第 j 个矩阵这一段矩阵链相乘的最小计算次数。

当我们计算(Ai*···*Ak)和(Ak*···Aj)这两个子矩阵链乘结果相乘时,
就相当于计算两个矩阵相乘,此中第一个子矩阵链乘结果是
p*p一个的矩阵,第二个子矩阵链乘结果是p*p一个的矩阵。
根据矩阵乘法运算量的计算公式,这两个子矩阵链乘结果相乘所需的乘法次数就是
p * p * p。


2.最长公共子序列(LCS)


题目描述

GXUOJ | 最长公共子序列(LCS)
https://i-blog.csdnimg.cn/direct/126b9dd76cce48bb87fc9df959e1582f.png
代码解答

#include<bits/stdc++.h>
using namespace std;

int main(){
        string text1,text2;
        cin>>text1>>text2;
        int len1=text1.length();
        int len2=text2.length();
        //这两个都可以
        //int len1=text1.size();
        //int len2=text2.size();
        int dp={0};
       
        for(int i=0;i<len1;i++){
                for(int j=0;j<len2;j++){
                        if(text1==text2)
                    //当前字符相等时,最长公共子序列长度在之前的基础上加 1
                                dp=dp+1;
                        else
                                dp=max(dp,dp);
                        //这意味着取text1去掉当前字符与text2的最长公共子序列长度
                                //和text2去掉当前字符与text1的最长公共子序列长度中的最大值。
       }
        }
       
        cout<<dp;
        return 0;
}


3.0-1背包题目

题目描述

GXUOJ | 0-1背包题目
https://i-blog.csdnimg.cn/direct/5b7bebf18f6e46319af9af2fec689958.png
代码解答

#include<bits/stdc++.h>
using namespace std;

int n,m;
const int N=1005;
int w,v,dp;

int main(){
        cin>>n>>m;
        for(int i=0;i<n;i++)
                cin>>v;
        for(int i=0;i<n;i++)
                cin>>w;
               
        for(int i=0;i<n;i++){
                for(int j=m;j>=w;j--){
                        // 状态转移方程:选择当前物品或不选择当前物品中的较大价值
                        dp=max(dp,dp]+v);
                }
        }
        cout<<dp;
}
4.带权区间调度

题目描述

GXUOJ | 带权区间调度(Weighted Interval Scheduling)
https://i-blog.csdnimg.cn/direct/9c94b1b6d3d544268d4cd76cf8bca9d3.png

代码解答

#include<bits/stdc++.h>
using namespace std;
const int N=1005;
struct Task{
        int start,end,value;
}tasks;

int dp;
bool compareTask(Task a,Task b){
        return a.end<b.end;
}
int find(int i){
        int l=0;int r=i-1;
        while(l<=r){
                int mid=(l+r)/2;
                // 如果中间位置任务的结束时间小于等于当前任务i的开始时间
      // 说明可能存在更靠后的不冲突任务,调整左边界
                if(tasks.end<=tasks.start)
                        l=mid+1;
                else
                        r=mid-1;
        }
        return r;
}
int main(){
        int n;cin>>n;
        for(int i=0;i<n;i++)
                cin>>tasks.start>>tasks.end>>tasks.value;
       
        sort(tasks,tasks+n,compareTask);
       
        for(int i=0;i<n;i++){
                int x=find(i);
                dp=max(dp,dp+tasks.value);
        }
        cout<<dp;
        return 0;
}

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: GXUOJ-算法-第二次作业