有m种不同的句子要组成一首n个句子的歌,每首歌都有一个美丽值,美丽值是由相邻的句子种类决定的,给出m*m的矩阵map[i][j]表示第i种句子和第j种句子的最大得分,一首歌的美丽值是由sum(map[i][i+1],map[i+1][i+2]....)

初始给出n个句子的值,为正就不能改变,为负表示可以替换,输出最大的美丽值.

dp[i][j]表示前i个句子且第i个句子种类为j的最大得分。下面分情况讨论.

if(p[i]>0)

  if(p[i-1]>0)  dp[i][p[i]]=dp[i-1][p[i-1]]+score[p[i-1]][p[i]];

  else if(p[i-1]<0) dp[i][p[i]]=max(dp[i][p[i]],dp[i-1][j]+score[j][p[i]]) (j>=0&&j<=m)

else if(p[i]<0)

  if(p[i-1]>0) dp[i][j]=max(dp[i][j],dp[i-1][p[i-1]]+score[p[i-1]][j]) (j>=0&&j<=m)

  else if(p[i-1]<0) dp[i][j]=max(dp[i][j],dp[i-1][k]+score[j][k])(j>=0&&j<=m,k>=0&&k<=m)

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
//#include <map>
#include <queue>
#include <deque>
//#pragma comment(linker, "/STACK:102400000,102400000")
#define CL(arr, val) memset(arr, val, sizeof(arr)) #define ll long long
#define INF 0x7f7f7f7f
#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0) #define L(x) (x) << 1
#define R(x) (x) << 1 | 1
#define MID(l, r) (l + r) >> 1
#define Min(x, y) (x) < (y) ? (x) : (y)
#define Max(x, y) (x) < (y) ? (y) : (x)
#define E(x) (1 << (x))
#define iabs(x) (x) < 0 ? -(x) : (x)
#define OUT(x) printf("%I64d\n", x)
#define lowbit(x) (x)&(-x)
#define Read() freopen("a.txt", "r", stdin)
#define Write() freopen("b.txt", "w", stdout);
#define maxn 110
#define maxv 5010
#define mod 1000000000
using namespace std;
int main()
{
//Read();
int t,n,m;
int score[][],p[],dp[][];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
for(int j=;j<=m;j++) scanf("%d",&score[i][j]);
for(int i=;i<=n;i++) scanf("%d",&p[i]);
memset(dp,,sizeof(dp));
for(int i=;i<=n;i++)
{
if(p[i]>)
{
if(p[i-]>)
{
dp[i][p[i]]=dp[i-][p[i-]]+score[p[i-]][p[i]];
}
else
{
for(int j=;j<=m;j++)
dp[i][p[i]]=max(dp[i][p[i]],dp[i-][j]+score[j][p[i]]);
}
}
else
{
if(p[i-]>)
{
for(int j=;j<=m;j++)
dp[i][j]=max(dp[i][j],dp[i-][p[i-]]+score[p[i-]][j]);
}
else
{
for(int j=;j<=m;j++)
for(int k=;k<=m;k++)
dp[i][j]=max(dp[i][j],dp[i-][k]+score[k][j]);
}
}
//printf("%d\n",dp[i][j]);
}
int ans=;
for(int i=;i<=m;i++)
ans=max(ans,dp[n][i]);
printf("%d\n",ans);
}
return ;
}

最新文章

  1. Azure PowerShell (8) 使用PowerShell设置Azure负载均衡器规则
  2. LINQ系列:LINQ to DataSet的DataView操作
  3. Java数据结构之字符串模式匹配算法---KMP算法
  4. Mssql Server如何修改列名
  5. Educational Codeforces Round 7 A. Infinite Sequence 水题
  6. Jackson怎样转换这样的字符串? String jsonStr = &quot;{dataType:&#39;Custom&#39;,regexp:&#39;t\\d+&#39;,msg:&#39;输入不正确&#39;}&quot;;
  7. python实时处理log文件脚本
  8. python 程序穩定性閒談-續集
  9. LinearLayout具体解释一:LinearLayout的简单介绍
  10. javascript生成新标签的三种方法
  11. 注意:MainActivity的oncreate方法里不要再inflate布局了(MainActivity里的点击事件无响应)
  12. 【小错误】WPF代码报错:未将对象引用设置到对象的实例。
  13. [剑指Offer]29-顺时针打印矩阵-Java
  14. Nginx详解十四:Nginx场景实践篇之代理服务
  15. Hbase 读写 原理
  16. fine安装教程
  17. WebSocket简单尝试
  18. python之路---09 初始函数 参数
  19. P1821 [USACO07FEB]银牛派对Silver Cow Party
  20. python下几种打开文件的方式

热门文章

  1. Bundle的用法
  2. spark性能优化-JVM虚拟机垃圾回收调优
  3. OCP 11g 第二章练习
  4. C# 移动控件
  5. 如何实现Windows宿主系统和虚拟机ubuntu系统文件互相访问
  6. 微信小程序开发系列四:微信小程序之控制器的初始化逻辑
  7. pip install python-igraph 报错,C core of igraph 没有安装。
  8. git命令(使用visual studio)
  9. Openjudge-4110-圣诞老人的礼物
  10. [POJ] 1191 [LUOGU] P1436 棋盘分割