[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 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

Source

2014 Asia AnShan Regional Contest

解题思路:

题意为有m种音符,编号1到m,我们要用这m种音符来创造一首带有n个音符的曲子(当然,一种音符可以用多次),假设有两个连续的音符 i ,j ,那么定义score(i,j)为这两个音符的得分,题目中预先给出所有的score(i,j)   1<=i,j<=m, 那么我们创造出的n个音符的曲子的得分为  score( note[i] , note[i+1] ) + score (note[i+1] ,note[i+2) +......score(note[n-1],note[n])
, i从1开始。 note [i] 代表n个音符的曲子中第i个音符是第几种音符, 1<=note[i]<=m, 比如 note[i]=3,就表示n个音符中第i个位置用的是第3种音符(一共有m种),预先给出 这n个音符,note[1] 到note[n] ,其中note[ i] 或者等于-1 ,或者 大于等于1小于等于m,对于后者,该位置的音符不能改变,对于前者,该位置可以换成任意的音符j(1<=j<=m), 问 这n个音符所获得的最大得分是多少。

虽然是简单Dp,但还是Dp题做的少,不敏感,一开始还用暴搜来做了。。

定义dp [i ][j],为前i个音符且第i个音符为第j种音符所获得的最大得分。

分情况讨论:

当note[i] >0 (i>=2)时:

当note[i-1]>0时: dp[i][note[i]]=dp[i-1][note[i-1]]+score[note[i-1]][note[i]];

当note[i-1]<0时: dp[i][note[i]]=max(dp[i][note[i]],dp[i-1][j]+score[j][note[i]]);   1<=j<=m,  枚举第i-1个音符是第几种音符

当note[i]<0    (i>=2)时:

当note[i-1]>0时:dp[i][j]=max(dp[i][j],dp[i-1][note[i-1]]+score[note[i-1]][j]);       1<=j<=m,     枚举第i个音符是第几种音符

当note[i-1]<0时:dp[i][j]=max(dp[i][j],dp[i-1][k]+score[k][j]);     1<=j,k<=m, 枚举第i个音符和第i-1个音符是第几种音符

代码:

#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int n,m;
int score[52][52];
int dp[102][52];//dp[i][j]表示为前i个音符,以第j种音符结尾所获得的最大分数
int note[102];
int ans;

void DP()
{
    memset(dp,0,sizeof(dp));
    for(int i=2;i<=n;i++)
    {
        if(note[i]>0)
        {
            if(note[i-1]>0)
                dp[i][note[i]]=dp[i-1][note[i-1]]+score[note[i-1]][note[i]];
            else
            {
                for(int j=1;j<=m;j++)
                    dp[i][note[i]]=max(dp[i][note[i]],dp[i-1][j]+score[j][note[i]]);
            }
        }
        else
        {
            if(note[i-1]>0)
            {
                for(int j=1;j<=m;j++)
                    dp[i][j]=max(dp[i][j],dp[i-1][note[i-1]]+score[note[i-1]][j]);
            }
            else
            {
                for(int j=1;j<=m;j++)
                    for(int k=1;k<=m;k++)
                    dp[i][j]=max(dp[i][j],dp[i-1][k]+score[k][j]);
            }
        }
    }
    ans=-1;
    if(note[n]>0)
        ans=dp[n][note[n]];
    else
    {
        for(int j=1;j<=m;j++)
        {
            if(ans<dp[n][j])
                ans=dp[n][j];
        }
    }
}

int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=m;i++)
            for(int j=1;j<=m;j++)
            cin>>score[i][j];
        for(int i=1;i<=n;i++)
            cin>>note[i];
        DP();
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-21 09:33:44

[ACM] HDU 5074 Hatsune Miku (简单DP)的相关文章

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 (线性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(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, whi

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 鞍山现场赛)

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(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

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