HDU 5074 Hatsune Miku(DP)

Problem Description

Hatsune Miku is a popular virtual singer. It is very popular in both Japan and China. Basically it is a computer software that allows you to compose a song on your own using the vocal package.

Today you want to compose a song, which is just a sequence of notes. There are only m different notes provided in the package. And you want to make a song with n notes.

Also, you know that there is a system to evaluate the beautifulness of a song. For each two consecutive notes a and b, if b comes after a, then the beautifulness for these two notes is evaluated as score(a, b).

So the total beautifulness for a song consisting of notes a1, a2, . . . , an, is simply the sum of score(ai, ai+1) for 1 ≤ i ≤ n - 1.

Now, you find that at some positions, the notes have to be some specific ones, but at other positions you can decide what notes to use. You want to maximize your song’s beautifulness. What is the maximum beautifulness you can achieve?

Input

The first line contains an integer T (T ≤ 10), denoting the number of the test cases.

For each test case, the first line contains two integers n(1 ≤ n ≤ 100) and m(1 ≤ m ≤ 50) as mentioned above. Then m lines follow, each of them consisting of m space-separated integers, the j-th integer in the i-th line for score(i, j)( 0 ≤ score(i, j) ≤ 100).
The next line contains n integers, a1, a2, . . . , an (-1 ≤ ai ≤ m, ai ≠ 0), where positive integers stand for the notes you cannot change, while negative integers are what you can replace with arbitrary
notes. The notes are named from 1 to m.

Output

For each test case, output the answer in one line.

Sample Input

2
5 3
83 86 77
15 93 35
86 92 49
3 3 3 1 2
10 5
36 11 68 67 29
82 30 62 23 67
35 29 2 22 58
69 67 93 56 11
42 29 73 21 19
-1 -1 5 -1 4 -1 -1 -1 4 -1

Sample Output

270
625

题意:略。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<limits.h>
typedef long long LL;
using namespace std;
#define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i )
#define REP( i , n ) for ( int i = 0 ; i < n ; ++ i )
#define CLEAR( a , x ) memset ( a , x , sizeof a )
int dp[110][110];
int t,n,m;
int mp[55][55];
int num[110];
void solve()
{
   memset(dp,-1,sizeof(dp));
   if(num[1]!=-1)
       dp[1][num[1]]=0;
   else
   {
       REPF(i,1,m)
         dp[1][i]=0;
   }
    REPF(i,2,n)
    {
        REPF(j,1,m)
        {
            if(dp[i-1][j]!=-1)
            {
               if(num[i]!=-1)
                     dp[i][num[i]]=max(dp[i][num[i]],dp[i-1][j]+mp[j][num[i]]);
               else
               {
                   REPF(k,1,m)
                     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]);
    printf("%d\n",ans);
}
int main()
{
    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",&num[i]);
       solve();
    }
    return 0;
}
时间: 2024-10-09 23:52:02

HDU 5074 Hatsune Miku(DP)的相关文章

[ACM] HDU 5074 Hatsune Miku (简单DP)

Hatsune Miku Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan and China. Basically it is a computer software that allows you to compose a song on your own using the vocal package. Today you want to compos

HDU 5074 Hatsune Miku (线性dp)

Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 654    Accepted Submission(s): 471 Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan

hdu 5074 Hatsune Miku(2014 鞍山现场赛)

Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 17    Accepted Submission(s): 14 Problem Description Hatsune Miku is a popular virtual singer. It is very popular in both Japan an

HDU 5074 Hatsune Miku(14鞍山区域赛 E)DP

题意:给定一个序列 有些位数未知,给你如果两个数连续所得到的能量,问你怎么安排数字使得总能量最大 解题思路:dp,只与上一个字母有关. 解题代码: 1 // File Name: e.cpp 2 // Author: darkdream 3 // Created Time: 2014年10月22日 星期三 12时16分10秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set&g

hdu - 5074 Hatsune Miku (简单dp)

有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]

HDU 5074 Hatsune Miku(简单二维dp)

题目大意:给你一些音符之间的联系,给你一个串,让你求出这个串的最大值.-1的时候可以任意替代,其他情况必须为序列上的数. 解题思路:简单二维dp,分情况处理就可以了啊. Hatsune Miku Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 637    Accepted Submission(s): 458 Problem De

HDU 5074 Hatsune Miku

Hatsune Miku Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on HDU. Original ID: 507464-bit integer IO format: %I64d      Java class name: Main Hatsune Miku is a popular virtual singer. It is very popular in both Japan and Chin

[HDU 5074] Hatsune Miku (动态规划)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 题目大意是给你m个note,n个数,得分是v[a[i]][a[i+1]]的总和,如果说a[i]是负数的话代表可以放人一个note,否则就只能放他给的note号. 问:最大的得分是多少? 我先写了记忆化搜索函数 dp(i,j)代表到第i个位置,放标号为j的note 那么 如果说a[i+1]<0,那么dp(i,j) = max( dp(i,j) , dp(i+1,k)+v[j][k] ); 否则d

HDU 5074 Hatsune Miku(2014鞍山赛区现场赛E题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5074 解题报告:给出一个长度为n的序列,例如a1,a2,a3,a4......an,然后这个序列的美丽值就是socre[a1][a2] + socre[a2][a3] + ..... socre[an-1][an],但是这个序列里面并不是所有的数都是确定的,输入包含一些大于0的数和一些-1,-1表示这个数可以任意,但是要在m的范围内,给出socre[i][j],求这个序列最大的美丽值. 一个二维dp