ACM/ICPC2014鞍山现场赛E hdu5074Hatsune Miku「建议收藏」

ACM/ICPC2014鞍山现场赛E hdu5074Hatsune Miku

大家好,又见面了,我是全栈君。

题目链接:题意:

给定一个m*m的矩阵mp。然后给定一个长度为n的序列

sum= mp[a[1]][a[2]]+……+mp[a[n-1]][a[n]];

假设a[i]小于0的话则a[i]能够为1~m之间的随意一个数,求sum的最大值

我们能够枚举第i个位置

然后dp[i][j]=max(dp[i][j],dp[i-1][k]+mp[k][j]) 表示第i个位置在j的最大值;

然后分两种情况

假设a[i]是一个确定的数的话 dp[i][a[i]]=max( dp[i][a[i]],dp[i-1][j]+mp[j][a[i]] )

假设不确定的话 就仅仅能枚举a[i]了 dp[i][k]=max(dp[i][k],dp[i-1][j]+mp[j][k]);

这两种情况都是建立在前一个位置已经确定了值的情况下;

代码例如以下:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxn = 55;
int mp[maxn][maxn];
int dp[maxn*2][maxn],a[maxn*2];

int main()
{
    int t,n,m;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            for(int j=1;j<=m;j++)
                scanf("%d",&mp[i][j]);
        }
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]);
        memset(dp,-1,sizeof(dp));
        if(a[1]!=-1)
            dp[1][a[1]]=0;
        else
            for(int i=1;i<=m;i++)
                dp[1][i]=0;
        for(int i=2;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(dp[i-1][j]!=-1){//假设前一项已经确定
                    if(a[i]!=-1)
                        dp[i][a[i]]=max(dp[i][a[i]],dp[i-1][j]+mp[j][a[i]]);
                    else{
                        for(int k=1;k<=m;k++)
                            dp[i][k]=max(dp[i][k],dp[i-1][j]+mp[j][k]);
                    }
                }
            }
        }
        /***************
        cout<<"   debug   "<<endl;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=m;j++)
                cout<<dp[i][j]<<" ";
            cout<<endl;
        }
        cout<<"***********"<<endl;
        **************/
        int maxn = -1000;
        for(int i=1;i<=m;i++)
            maxn=max(dp[n][i],maxn);
        printf("%d\n",maxn);
    }
    return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115913.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++ STL它vector详细解释

    C++ STL它vector详细解释

    2022年1月8日
    46
  • oracle 高水位线

    oracle 高水位线

    2021年8月30日
    48
  • 一篇关于数据库的操作

    0x00了解数据库数据库是“按照数据结构来组织、存储和管理数据的仓库”。是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。数据库是以一定方式储存在一起、能与多个用户共享、

    2021年12月11日
    38
  • Rabbitmq安装_rabbitmq 配置

    Rabbitmq安装_rabbitmq 配置RabbitMQ服务器如何安装?RabbitMQ是一个AMQP(AdvancedMessageQueue,即高级消息队列协议)服务器。下载地址: RabbitMQ下载安装说明:各

    2022年8月3日
    4
  • JAVA常用数据结构及原理分析(面试总结)「建议收藏」

    JAVA常用数据结构及原理分析(面试总结)「建议收藏」最近准备面试,因此整理一份Java中常用的数据结构资料,方便面试;java.util包中三个重要的接口及特点:List(列表)、Set(保证集合中元素唯一)、Map(维护多个key-value键值对,保证key唯一)。其不同子类的实现各有差异,如是否同步(线程安全)、是否有序。常用类继承树:以下结合源码讲解常用类实现原理及相互之间的差异。Collection(所有…

    2022年7月8日
    18
  • 深度学习——SPPNet原理[通俗易懂]

    深度学习——SPPNet原理[通俗易懂]从R-CNN到FastR-CNN,有必要了解下SPPNet,其全称为SpatialPyramidPoolingConvolutionalNetworks(空间金字塔池化卷积网络)。它将CNN的输入从固定尺寸改进为任意尺寸,例如在CNN结构中,输入图像的尺寸往往固定的(如224×224像素),输出可看做固定维数的向量。SPPNet在普通的CNN结构中加入了ROI池化层(ROIPo…

    2022年6月11日
    36

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号