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


相关推荐

  • robots txt防爬虫[通俗易懂]

    robots txt防爬虫[通俗易懂]title:robots.txt防爬虫date:2018-07-1218:20:00tags:防坑指南categories:防坑指南事因:公司内部项目在百度搜索上输入名字会出现在搜索结果中,大佬们肯定不愿意啊,就需要禁止爬虫爬取。在项目根目录加入这个文件就行了。WHAT?::::::robots.txt是一个纯文本文件,是爬虫抓取网站的时候要查看的第一个文件,…

    2022年6月7日
    43
  • Zotero+zotfile+坚果云+PDF Expert超好用的多设备协同文献管理组合(保姆级别)

    Zotero+zotfile+坚果云+PDF Expert超好用的多设备协同文献管理组合(保姆级别)一 Zetero 的下载和安装点击左侧的 Download 即可下载安装时可以选择两个模式 standard 按照最通常的设置安装 没有办法改变安装位置 默认 C 盘 和 custom 可以改变安装位置 我选择了 custom 之后就选择好安装位置之后正常安装就可以二 下载常用插件 1 ZoteroConnec 可以在浏览器中收集论文到 zetero 中 点击 InstallEdgeC 即可以下载下载完成后会有一个 xpi 文件 选中后按空格即可以安装这个

    2025年11月18日
    4
  • 不要再被骗了——QQ盗号原理大揭秘

    不要再被骗了——QQ盗号原理大揭秘前言相信大家在懵懂无知的时候都有被盗号的经历吧,QQ胡乱的加好友,突然有个好友传了个文件给你,打开以后发现QQ竟然显示强制下线,然后再也上不去了QAQ,很明显,QQ号被人盗了。最近也是很多小伙伴私信我,也看了一些人发空间说QQ号被盗了啥的,以及我自己收到的一些诈骗请求。网上针对防骗这块的文章几乎没有,为了不让更多的人受害,下面我将会以最真实朴素的语言介绍最常见的一种盗号诈骗方式,浅析一下这个盗…

    2022年6月16日
    649
  • TM影像波段介绍「建议收藏」

    TM影像波段介绍「建议收藏」一、各波段特征:1.TM10.45-0.52um,蓝波段,对水体穿透强,对叶绿素与叶色素反映敏感,有助于判别水深及水中叶绿素分布以及水中是否有水华等.2.TM20.52-0.60um,绿波段,对健康茂盛植物的反射敏感,对力的穿透力强,用于探测健康植物绿色反射率,按绿峰反射评价植物的生活状况,区分林型,树种和反映水下特征.3.TM30.62-0.69UM,红波段,叶绿

    2022年7月23日
    19
  • Scanner in = new Scanner(System.in);是什么意思?

    Scanner in = new Scanner(System.in);是什么意思?Scanner是一个类,in是一个实例或者说是对象!new是一个创建对象的方法……Scanner这个类最实用的地方表现在获取控制台输入。就相当与声明这是一个人类(Scanner),这个人类是谁(in),后面新创建一个人类newScanner(system.in),system.in表示他有什么特征。总的来说就是新创建一个输入的Scanner对象,然后赋值给in。用人类的话来说…

    2022年7月20日
    21
  • Mysql8.0 mysqldump 报错:Unknown table ‘COLUMN_STATISTICS‘ in information_schema (1109)

    Mysql8.0 mysqldump 报错:Unknown table ‘COLUMN_STATISTICS‘ in information_schema (1109)在mysql8.0之前的mysqldump命令格式为:mysqldump–host=&lt;server&gt;–port=&lt;port&gt;–user&lt;user&gt;–passworddatabase&gt;dump_file_pathmysql8.0版本此命令会报错Unknowntable’COLUMN_STATISTICS’ini…

    2025年11月25日
    6

发表回复

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

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