zoukankan      html  css  js  c++  java
  • Tyvj1078

    题目链接

    分析:
    这个题有点像矩阵取数
    实际上每次取数的时候,取的区间的答案是不随时间的变化而变化的
    也就是说,每一部分的答案都是固定的,
    我们可以只看区间(i,j)内的最优答案
    反映到实际方案上,我们只要调整一下取数的顺序
    按照从两边到中间的区间顺序取数就可以满足题意了

    说到底,题目限制只能从两边取的限制是迷惑选手的

    那么状态就很简单了
    设状态:
    f[i][j]表示删掉i到j的所有数能到的最大值
    枚举上一次的删除区间端点k
    f[i][j]=max{f[i][k]+sum(k+1,j),f[k][j]+sum(i,k-1)

    tip

    在tyvj上第4个点被卡掉了,原因玄学。。。

    这里写代码片
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    
    using namespace std;
    
    int n,a[110];
    int f[110][110];
    
    int abs(int x)
    {
        if (x>0) return x;
        else return -x;
    }
    
    int get(int x,int y)
    {
        if (x==y) return a[x];
        if (x>y) swap(x,y);
        return abs(a[x]-a[y])*(y-x+1);
    }
    
    int main()
    {
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d",&a[i]),f[i][i]=a[i];
        for (int i=n-1;i>=1;i--)
            for (int j=i+1;j<=n;j++)
                for (int k=i;k<=j;k++)
                {
                    if (k!=j) f[i][j]=max(f[i][j],f[i][k]+get(k+1,j));
                    if (k!=i) f[i][j]=max(f[i][j],f[k][j]+get(i,k-1));
                }
        printf("%d",f[1][n]);
        return 0;
    }
  • 相关阅读:
    SDN3
    SDN2
    SDN1
    软工实践5
    2019 SDN上机第二次作业
    2019 SDN上机第一次作业
    软件工程实践2019第五次作业
    软件工程实践2019第四次作业
    软件工程实践2019第三次作业
    软件工程实践2019第二次作业
  • 原文地址:https://www.cnblogs.com/wutongtong3117/p/7673292.html
Copyright © 2011-2022 走看看