dp得60分的看过来
查看原帖
dp得60分的看过来
306945
J_Ignite楼主2020/12/2 19:27

原来的代码:

#include <bits/stdc++.h>
using namespace std;
const int inf = 2147483647;
const int MAXN = 35;
typedef long long ll;
ll n, a[MAXN];
ll f[MAXN][MAXN]; // f[i][j] => i ~ j best score.
ll p[MAXN][MAXN];
ll ans[MAXN], top;
void output(int l, int r)
{
    if (l > r)
        return;
    ll k = p[l][r];
    printf("%lld ", k);
    output(l, k - 1);
    output(k + 1, r);
}

int main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++)
        scanf("%lld", a + i);
    for (int i = 1; i <= n; i++) // Pay attention
        for (int j = 1; j <= n; j++)
            f[i][j] = 1;
    for (int i = 1; i <= n; i++)
        f[i][i] = a[i], p[i][i] = i;
    for (int len = 2; len <= n; len++)
        for (int l = 1, r = l + len - 1; r <= n; l++, r++)
            for (int k = l; k <= r; k++)
            {
                int nx = f[l][k - 1] * f[k + 1][r] + a[k];// Pay attention
                if (nx > f[l][r])
                {
                    f[l][r] = nx;
                    p[l][r] = k;
                }
            }

    printf("%lld\n", f[1][n]);
    output(1, n);
#ifndef ONLINE_JUDGE
    system("pause");
#endif
    return 0;
}

在第二个pay attention 的地方,有可能会涉及f[1][0]的情况。而按照题意,f[1][0]应该被初始化为 11 ,所以第一个Pay attention 的地方应该改为从0开始循环初始化:

#include <bits/stdc++.h>
using namespace std;
const int inf = 2147483647;
const int MAXN = 35;
typedef long long ll;
ll n, a[MAXN];
ll f[MAXN][MAXN]; // f[i][j] => i ~ j best score.
ll p[MAXN][MAXN];
ll ans[MAXN], top;
void output(int l, int r)
{
    if (l > r)
        return;
    ll k = p[l][r];
    printf("%lld ", k);
    output(l, k - 1);
    output(k + 1, r);
}

int main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++)
        scanf("%lld", a + i);
    for (int i = 0; i <= n; i++) // ! from 0
        for (int j = 0; j <= n; j++)
            f[i][j] = 1;
    for (int i = 1; i <= n; i++)
        f[i][i] = a[i], p[i][i] = i;
    for (int len = 2; len <= n; len++)
        for (int l = 1, r = l + len - 1; r <= n; l++, r++)
            for (int k = l; k <= r; k++)
            {
                int nx = f[l][k - 1] * f[k + 1][r] + a[k];
                if (nx > f[l][r])
                {
                    f[l][r] = nx;
                    p[l][r] = k;
                }
            }

    printf("%lld\n", f[1][n]);
    output(1, n);
#ifndef ONLINE_JUDGE
    system("pause");
#endif
    return 0;
}

也许能帮到你们,不懂就问

2020/12/2 19:27
加载中...