dp求调
查看原帖
dp求调
1050431
DevilsFlame楼主2025/6/28 17:40

实在找不出bug来了啊QAQ

WA on #5, 6, 7, 9, 10

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 25;
int n,s[N],sum[N],j,f[N][N],deep;
int to[N][N];//区间[i,j],在l后面放+号
vector <int> e[N];
void dfs(int a,int b,int d) {//区间[a,b],d为深度
    if(a == b) {//到底了
        cout << s[a];
        return;
    }
    deep = max(deep,d);//最大深度
    e[d].push_back(sum[b] - sum[a - 1]);//存到深度为d的数组里
    cout << '(';
    int l = to[a][b];
    dfs(a,l,d + 1);
    cout << '+';
    dfs(l + 1,b,d + 1);
    cout << ')';
    return;
}
signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin >> n;
    for(int i = 1;i <= n;i ++) {
        cin >> s[i];
        sum[i] = sum[i - 1] + s[i];
    }
    // for(int i = 1;i <= n;i ++) f[i][i] = 0;
    for(int k = 1;k < n;k ++)
        for(int i = 1;i <= n - k;i ++) {
            j = i + k;
            f[i][j] = LONG_LONG_MAX;
            for(int l = i;l < j;l ++) {
                if(f[i][l] + f[l + 1][j] + sum[j] - sum[i - 1] < f[i][j]) {
                    f[i][j] = f[i][l] + f[l + 1][j] + sum[j] - sum[i - 1];
                    to[i][j] = l;
                }
            }
        }
    dfs(1,n,1);
    cout << '\n' << f[1][n] << '\n';
    for(int i = deep;i;i --)//深度从大到小输出
        for(int j = 0;j < e[i].size();j ++) cout << e[i][j] << ' ';
    return 0;
}
2025/6/28 17:40
加载中...