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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【手把手教你树莓派3 (三)】scp命令传文件

    【手把手教你树莓派3 (三)】scp命令传文件概述在没有显示器的情况下,只能通过ssh来远程登录树莓派。那比如我们要在树莓派里面建站,绝对不会想通过树莓派的终端coding,其实最好的办法是在另一台linux机器下编好代码,然后把项目拷贝至树莓派。scp命令可以使用scp命令,这个命令是cp命令的远程版。如果从本机传文件到树莓派,我们需要另开一个本机的终端(而非远程ssh连接树莓派的)命令如下:scplocal_file

    2022年8月22日
    7
  • 实现div里的img图片水平垂直居中

    实现div里的img图片水平垂直居中body结构<body><div><imgsrc="1.jpg"alt="haha"></div></body>方法一:将display设置成table-cell,然后水平居中设置text-align为center,垂直居中设置vertical-align为middle。<styletype="text/css">*{

    2022年5月5日
    61
  • 数据库基本操作和常用命令

    1.MySQL数据库2.SQL语句###01数据库概念*A:什么是数据库数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作。*B:什么是数据库管理系统数据库管理系统(DataBaseManagementSystem,DBMS):指一种操作和管理数据库的大型软件,用于建立、使用和维护数据库,…

    2022年4月6日
    57
  • java.util.scanner sc_Java的Scanner sc=new Scanner(System.in)是什么意思「建议收藏」

    java.util.scanner sc_Java的Scanner sc=new Scanner(System.in)是什么意思「建议收藏」展开全部当通过newScanner(System.in)创建一个Scanner,控制台会一直等待输入,62616964757a686964616fe58685e5aeb931333433653935直到敲回车键结束,把所输入的内容传给Scanner,作为扫描对象。如果要获取输入的内容,则只需要调用Scanner的nextLine()方法即可。例:importjava.util.Scanner;…

    2022年7月20日
    14
  • BeanCopier_contabo测评

    BeanCopier_contabo测评概述常见或常用的几种Bean属性复制工具Apache.BeanUtilsApache.PropertyUtilSpring.BeanUtilsCglib.BeanCopierMapStructEZMorph使用场景:Dto与Entity转换普通属性复制个别属性过滤属性类型转换数组或集合拷贝性能对比测试在两个简单的Bean之间转换的耗时,执行次数分别为10、10…

    2025年9月14日
    6
  • Maven配置阿里云仓库下载依赖「建议收藏」

    Maven配置阿里云仓库下载依赖「建议收藏」用过Maven的都知道Maven的方便便捷,但由于某些网络原因,访问国外的Maven仓库不便捷,maven默认使用的是国外的中央仓库,下载jar时有时候会因为网络不好等原因下载不全或失败,好在国内像阿里云、网易、JBoos、开源中国等大厂搭建了国内的maven仓库,阿里云的maven仓库使用的比较多:需要使用的话,要在maven的settings.xml文件里配置mirrors的子节点,添加…

    2022年6月22日
    97

发表回复

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

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