博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACM 2014 鞍山区域赛 E - Hatsune Miku (dp)
阅读量:2135 次
发布时间:2019-04-30

本文共 1236 字,大约阅读时间需要 4 分钟。

题目大意:

      给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽值就是mp[a1][a2] + mp[a2][a3] + ..... mp[an-1][an],但是这个序列里面并不是所有的数都是确定的,输入包含一些大于0的数和一些-1,-1表示这个数可以任意,但是要在m的范围内,给出s[i][j],求这个序列最大的美丽值.

解题思路:

      dp[i][j]表示序列的第i个数选j的最大美丽值。

①当a[i-1]>0时,就表示第i-1个数只能选a[i-1],所以

        dp[i][j]=max(dp[i-1][a[i-1]]+mp[a[i-1]][j])

②当a[i-1]<0时,要开两层循环,分别枚举第i-1个选什么值和当前第i个选什么值

       dp[i][k]=max(dp[i-1][j]+mp[j][k]);

#include
#include
using namespace std;int a[110];int mp[110][110];int dp[110][110];int main(){ //freopen("input.txt","r",stdin); int T; cin>>T; int n,m; while(T--) { cin>>n>>m; for(int i=1;i<=m;++i) for(int j=1;j<=m;++j) cin>>mp[i][j]; for(int i=1;i<=n;++i) cin>>a[i]; memset(dp,0,sizeof(dp)); for(int i=2;i<=n;++i) { if(a[i-1]>0) for(int j=1;j<=m;++j) dp[i][j]=max(dp[i][j],dp[i-1][a[i-1]]+mp[a[i-1]][j]); else { for(int j=1;j<=m;++j) for(int k=1;k<=m;++k) dp[i][k]=max(dp[i][k],dp[i-1][j]+mp[j][k]); } } int ans=0; for(int i=1;i<=m;++i) ans=max(ans,dp[n][i]); cout<
<

 

转载地址:http://iufgf.baihongyu.com/

你可能感兴趣的文章
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
逆序对的数量(递归+归并思想)
查看>>
数的范围(二分查找上下界)
查看>>
算法导论阅读顺序
查看>>
Windows程序设计:直线绘制
查看>>
linux之CentOS下文件解压方式
查看>>
Django字段的创建并连接MYSQL
查看>>
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>