Luo Gu P1043 numbers game

topic

Section DP, the \ (MAXN [i] [j] [k] \) is expressed as j i to the maximum interval is divided into k intervals obtained, \ (Minn \) represents the minimum value.

You may then be obtained state transition equation:
\ [MAXN [I] [j] [K] = max (MAXN [I] [j] [K], MAXN [I] [L] [K-. 1] * (L to j and)) \] a \ 10% after .

Then determine what the boundaries will be able to get the final answer.

#include <bits/stdc++.h>
using namespace std;
int n, m, data[1001010];
int sum[111], ha[111][111];//每一段区间的和
int maxn[111][111][111], minn[111][111][111]; 
int ans1, ans2 = 2147483647;
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &data[i]);
        data[i + n] = data[i];
    }
    n *= 2;
    for (int i = 1; i <= n; i++)
        sum[i] = sum[i - 1] + data[i];
    memset(minn, 12, sizeof(minn));
    for (int i = 1; i <= n; i++)
        for (int j = i + 1; j <= n; j++)
            ha[i][j] = (sum[j] - sum[i] + 100000) % 10, maxn[i][j][1] = minn[i][j][1] = ha[i][j];
    for (int k = 2; k <= m; k++)
        for (int i = 1; i <= n; i++)
            for (int j = i + k - 1; j <= n; j++)
            {
                minn[i][j][k] = 214748367;
                for (int l = i + k - 2; l < j; l++)
                {
                    maxn[i][j][k] = max(maxn[i][l][k - 1] * ha[l][j], maxn[i][j][k]);
                    minn[i][j][k] = min(minn[i][l][k - 1] * ha[l][j], minn[i][j][k]);
                }
            }
    for (int i = 1; i <= n / 2; i++)
        ans1 = max(maxn[i][i + n / 2][m], ans1), ans2 = min(minn[i][i + n / 2][m], ans2);
    printf("%d\n%d", ans2, ans1);
    return 0;
}

Guess you like

Origin www.cnblogs.com/liuwenyao/p/11685976.html