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