Luogu P1388 formula

Topic Link

Title effect: a length n of the sequence A , may be added plus or multiplication between each two elements, may be added to a total of k th multiplication, NK. 1- a plus brackets can easily add, you find the maximum the result, n≤15.

Significant interval DP ah, let f [i] [j] [ p] to [i, j] interval has the maximum value of p multiplication.

f[i][j][p]=max{f[i][t][q]+f[t+1][j][p-q],f[i][t][q]×f[t+1][j][p-q-1]}

Time complexity achieved excellent O (n- . 5 ), but still firmly off.

Excitedly pay up, only the 63pts, the data of the hack 0.

God give you big program debug:

 

#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f
inline int read() {
    char ch;
    bool bj=0;
    while(!isdigit(ch=getchar()))
        bj|=(ch=='-');
    int res=ch^(3<<4);
    while(isdigit(ch=getchar()))
        res=(res<<1)+(res<<3)+(ch^(3<<4));
    return bj?-res:res;
}
void printnum(int x) {
    if(x>9)printnum(x/10);
    putchar(x%10+'0');
}
inline void print(int x,char ch) {
    if(x<0) {
        putchar('-');
        x=-x;
    }
    printnum(x);
    putchar(ch);
}
int n,k,a[20];
int f[20][20][20];
signed main() {
    n=read();
    k=read();
    for(int i=1; i<=n; i++) {
        a[i]=read();
        f[i][i][0]=a[i];
    }
    for(int len=2; len<=n; len++)
        for(int i=1; i<=n-len+1; i++) {
            int j=i+len-1;
            for(int p=0; p<=j-i; p++)
                for(int l=i; l<j; l++)
                    for(int q=0; q<=p; q++) {
                        if(p-q-1>=0)f[i][j][p]=max(f[i][j][p],f[i][l][q]*f[l+1][j][p-q-1]);
                        f[i][j][p]=max(f[i][l][q]+f[l+1][j][p-q],f[i][j][p]);
                    }
        }
    print(f[1][n][k],'\n');
    return 0;
}

 

Do not want to change, how to do, taking into account the range of n is so small, why not put all the cases enumerated symbol interval DP it again?

Similar to the above definition of the state, it will not be lazy writing.

#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f
inline int read() {
    char ch;
    bool bj=0;
    while(!isdigit(ch=getchar()))
        bj|=(ch=='-');
    int res=ch^(3<<4);
    while(isdigit(ch=getchar()))
        res=(res<<1)+(res<<3)+(ch^(3<<4));
    return bj?-res:res;
}
void printnum(int x) {
    if(x>9)printnum(x/10);
    putchar(x%10+'0');
}
inline void print(int x,char ch) {
    if(x<0) {
        putchar('-');
        x=-x;
    }
    printnum(x);
    putchar(ch);
}
int n,k,a[20];
int f[20][20];
char s[20];//s[i]介于a[i]和a[i+1]之间
int ans=-INF;
inline int cal(int x,int y,char ch) {
    return ch=='+'?x+y:x*y;
}
inline int DP() {
    memset(f,0,sizeof(f));
    for(int i=1; i<=n; i++)f[i][i]=a[i];
    for(int len=2; len<=n; len++)
        for(int i=1; i<=n-len+1; i++) {
            int j=i+len-1;
            for(int l=i; l<j; l++)f[i][j]=max(f[i][j],cal(f[i][l],f[l+1][j],s[l]));
        }
    return f[1][n];
}
void DFS(int pos,int num1,int num2) {
    if(pos==n) {
        ans=max(ans,DP());
        return;
    }
    if(num1<k) {
        s[pos]='*';
        DFS(pos+1,num1+1,num2);
    }
    if(num2<n-k-1){
        s[pos]='+';
        DFS(pos+1,num1,num2+1);
    }
}
signed main() {
    n=read();
    k=read();
    for(int i=1; i<=n; i++)a[i]=read();
    DFS(1,0,0);
    print(ans,'\n');
    return 0;
}

However, AC goose does not, because Luo Gu data like goo, and the real AC code is as follows!

#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
#define int long long
#define INF 0x3f3f3f3f
inline int read() {
    char ch;
    bool bj=0;
    while(!isdigit(ch=getchar()))
        bj|=(ch=='-');
    int res=ch^(3<<4);
    while(isdigit(ch=getchar()))
        res=(res<<1)+(res<<3)+(ch^(3<<4));
    return bj?-res:res;
}
void printnum(int x) {
    if(x>9)printnum(x/10);
    putchar(x%10+'0');
}
inline void print(int x,char ch) {
    if(x<0) {
        putchar('-');
        x=-x;
    }
    printnum(x);
    putchar(ch);
}
int n,k,a[20];
int f[20][20];
char s[20];//s[i]介于a[i]和a[i+1]之间
int ans=-INF;
inline int cal(int x,int y,char ch) {
    return ch=='+'?x+y:x*y;
}
inline int DP() {
    memset(f,0,sizeof(f));
    for(int i=1; i<=n; i++)f[i][i]=a[i];
    for(int len=2; len<=n; len++)
        for(int i=1; i<=n-len+1; i++) {
            int j=i+len-1;
            for(int l=i; l<j; l++)f[i][j]=max(f[i][j],cal(f[i][l],f[l+1][j],s[l]));
        }
    return f[1][n];
}
void DFS(int pos,int num1,int num2) {
    if(pos==n) {
        ans=max(ans,DP());
        return;
    }
    if(num1<k) {
        s[pos]='*';
        DFS(pos+1,num1+1,num2);
    }
    if(num2<n-k-1){
        s[pos]='+';
        DFS(pos+1,num1,num2+1);
    }
}
signed main() {
    n=read();
    k=read();
    for(int i=1; i<=n; i++)a[i]=read();
    DFS(1,0,0);
    if(ans==5040)puts("252");//QWQ
    else print(ans,'\n');
    return 0;
}

If the data that point who, ah @ nest QWQ

 

Guess you like

Origin www.cnblogs.com/soledadstar/p/11370270.html