|
区间DP
- #include<iostream>
- using namespace std;
- #define FOR(i,n,m) for(int i=n;i<=m;i++)
- int n,a[110];
- int f[110][110][2];
- void dfs(int l,int r)
- {
- if(l>r) return;
- if(l==r) {cout<<l<<" ";return;}
- cout<<f[l][r][1]<<" ";
- dfs(l,f[l][r][1]-1);
- dfs(f[l][r][1]+1,r);
- }
- int main()
- {
- cin>>n;FOR(i,1,n) cin>>a[i];
- FOR(i,1,n) f[i][i][0]=a[i];
- FOR(i,2,n) FOR(j,1,n-i+1) FOR(k,j,i+j-1)
- {
- if(!f[j][k-1][0]) f[j][k-1][0]=1;if(!f[k+1][i+j-1][0]) f[k+1][i+j-1][0]=1;
- if(f[j][k-1][0]*f[k+1][i+j-1][0]+a[k]>f[j][i+j-1][0])
- {
- f[j][i+j-1][0]=f[j][k-1][0]*f[k+1][i+j-1][0]+a[k];
- f[j][i+j-1][1]=k;
- ///cout<<j<<" "<<i+j-1<<" "<<k<<" "<<f[j][i+j-1][0]<<' '<<f[j][i+j-1][1]<<endl;
- }
- }
- cout<<f[1][n][0]<<endl;
- dfs(1,n);
- return 0;
- }
复制代码 |
|