• 算法作业实验三


    /*105.最大字段和 (15分)
    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:
    给定长度为n的整数序列,a[1...n], 求[1,n]某个子区间[i , j]使得a[i]+…+a[j]和最大.
    或者求出最大的这个和.例如(-2,11,-4,13,-5,2)的最大子段和为20,所求子区间为[2,4].
    输入描述
    第一行为一个整数n,表示数组有n个数据,第二行依次输入n个整数
    输出描述
    计算出n个整数中连续k个数的最大和
    输入样例
    5
    1 2 3 4 5

    7
    6 -5 5 8 -13 5 7

    输出样例
    15
    14
    */

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    const int maxn = 1e4+10;
    int a[maxn];
    int dp[maxn][maxn];
    int main(){
        int n;
        cin>>n;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                if(j==i)
                    dp[i][j] = a[i];
                else
                    dp[i][j] =dp[i][j-1]+a[j];
            }
        }
        int m=0;
        for(int i=0;i<n;i++){
            for(int j=i;j<n;j++){
                m = max(m,dp[i][j]);
            }
        }
        cout<<m<<endl;
    
        return 0;
    } 

    /*326.0/1背包问题 (20分)
    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:

        物品集合U={u1,u2…un},体积分别为s1,s2…..sn,价值分别为v1,v2….vn;容量C的背包。设计算法实现放入背包的物品价值最大。

    输入描述

    第一行输入物品数n,第二行输入每个物品体积,第三行输入每个物品的价值,第四行输入背包的容量C


    输出描述

    输出最大价值数。


    输入样例

    3
    3 4 5
    4 5 6
    10


    输出样例

    11*/

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    const int maxn = 1e4+10;
    int s[maxn],v[maxn];
    int C;
    int dp[maxn][maxn];
    int main(){
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
            scanf("%d",&s[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        cin>>C;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=C;j++){
                if(j-s[i]>=0)
                    dp[i][j] = max(dp[i][j],dp[i-1][j-s[i]]+v[i]);
                else
                    dp[i][j] = dp[i-1][j];
            }
        }
        int mm=0;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=C;j++)
                mm = max(mm,dp[i][j]);
        }
        cout<<mm<<endl;
        
        return 0;
    }

    /*502.矩阵连乘最少计算量 (10分)
    C时间限制:3000 毫秒 |  C内存限制:3000 Kb
    题目内容:
     n个矩阵A1,A2,...,An, ,如果其维度分别为d0xd1, d1xd2, ...dn-1xdn,则可以进行连乘运算A1A2A3..An .
    连乘运算可以采取不同的顺序进行,如(A1A2)A3 和 A1(A2A3),这两种顺序的消耗乘法计算量是不同的,前者是
    d0.d1.d2+d0.d2.d3,后者d0.d1.d3+d1.d2.d3.

    第1步选择哪两个,第2步又选择哪两个,一直到最后算出结果需要做n-1次决定。其中有一种计算顺序使得
    A1A2A3..An总的乘法计算量最小。
    输入描述
    第一行输入n
    第二行输入维度向量d0,d1,...dn

    输出描述
    输出所需的最少乘法次数。

    输入样例
    4
    2 3 2 4 3

    输出样例
    48*/

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    const int maxn = 1e4+10; 
    const int INF = 0x3f3f3f;
    int a[maxn];
    int dp[maxn][maxn];
    int main(){
        int n;
        cin>>n;
        for(int i=0;i<=n;i++){
            scanf("%d",&a[i]);
        }
        memset(dp,0,sizeof(dp));
        for(int r=2;r<=n;r++){
            for(int i=1;i<=n-r+1;i++){
                int j = i+r-1;
                dp[i][j] = INF;
                for(int k = i;k<j;k++){
                    dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+a[i-1]*a[k]*a[j]);
                }    
            }
        }
        cout<<dp[1][n]<<endl;
        return 0;
    }
  • 相关阅读:
    Mysql.linux登录数据库
    Linux.vim编辑器显示行号
    经济学-泰勒
    MyBatis.多条件排序
    Mysql.复选条件的查询
    前端.省市级联框
    前端.解决form-contral总是换行问题
    若依框架. 仿ThymeLeaf前端SelectDictLable方法
    excel中为什么不显示单引号
    python-爬虫(3)---lxml匹配css
  • 原文地址:https://www.cnblogs.com/lusiqi/p/11736601.html
Copyright © 2020-2023  润新知