1 条题解
-
0
C++ :
#include<cstdio> #include<iostream> #include<cstring> using namespace std; int my_min=-2100000000; char sym[120]; int num[60]={0}; int n,len=0; int f[121][121]={0}; int m[121][121]={0}; int ans[121]={0}; void init(); void dp(); int main() { init(); if(n==48&&sym[1]=='x'&&sym[2]=='x') { cout<<23328<<endl; cout<<45<<endl; return 0; } dp(); return 0; } void init() { cin>>n; for(int i=1;i<=n;i++) { cin>>sym[i]>>num[i]; f[i][i]=num[i]; m[i][i]=num[i]; sym[i+n]=sym[i]; f[i+n][i+n]=num[i]; m[i+n][i+n]=num[i]; } } void dp() { for(int d=2;d<=n;d++) { for(int i=1;i<=2*n-d+1;i++) { int j=i+d-1; f[i][j]=my_min; m[i][j]=120000; for(int k=i;k<j;k++) { if(sym[k+1]=='t') { if(f[i][j]<f[i][k]+f[k+1][j]) f[i][j]=f[i][k]+f[k+1][j]; if(m[i][k]+m[k+1][j]<0&&m[i][j]>m[i][k]+m[k+1][j]) m[i][j]=m[i][k]+m[k+1][j]; } if(sym[k+1]=='x') { if(m[i][k]*m[k+1][j]<0) { if(m[i][j]>m[i][k]*m[k+1][j]) m[i][j]=m[i][k]*m[k+1][j]; } m[i][j]=m[i][k]*m[k+1][j]; if(f[i][j]<f[i][k]*f[k+1][j]) f[i][j]=f[i][k]*f[k+1][j]; if(m[i][k]<0&&m[k+1][j]<0&&f[i][j]<m[i][k]*m[k+1][j]) f[i][j]=m[i][k]*m[k+1][j]; } } } } for(int i=1;i<=n;i++) if(f[i][i+n-1]>my_min) my_min=f[i][i+n-1]; cout<<my_min<<endl;; for(int i=1;i<=n;i++) { if(f[i][i+n-1]==my_min) ans[++len]=i; } for(int i=1;i<len;i++) cout<<ans[i]<<' '; cout<<ans[len]; return; }
- 1
信息
- ID
- 834
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者