HDU5074(DP)

1721 단어
물 DP 비교.
제목은 m개의 다른 음부로 n개의 음표를 포함하는 음악을 창작하는 것이다. a1, a2, a3...an.max(sore(a1,a2)+sore(a2,a3)+...+ 요구sore(an-1, an)).
dp[i][j]로 i번째 음표가 j를 사용하는 최대 가치를 표시하고max(a[n][k]|1<=k<=m)가 답이다.
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
#define maxn 111
#define INF 111111111

int dp[maxn][maxn];
int n, m;
int mp[maxn][maxn];
int a[maxn];

int main () {
    //freopen ("data.txt", "r", stdin);
    int t;
    cin >>t;
    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];
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= m; j++)
                dp[i][j] = -INF;
        if (a[1] == -1) {
            for (int i = 1; i <= m; i++)
                dp[1][i] = 0;
        }
        else dp[1][a[1]] = 0;
        for (int i = 2; i <= n; i++) {
            if (a[i] != -1) {
                for (int j = 1; j <= m; j++)
                    dp[i][a[i]] = max (dp[i][a[i]], dp[i-1][j]+mp[j][a[i]]);
            }
            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]+mp[k][j]);
                }
            }
        }
        int ans = -1;
        for (int i = 1; i <= m; i++)
            ans = max (ans, dp[n][i]);
        cout << ans << endl;
    }
    return 0;
}

좋은 웹페이지 즐겨찾기