https://vjudge.net/problem/POJ-1179
You should not only DP the Max
but also DP the min
And using the double length
the time will from the n^4 reduce to the n^3
顺便VJ上400道题
纪念一下
WildCow 学长他们队在大连站回放赛上AK了
强啊
龙哥和杨哥拿了个蓝桥杯国赛三等奖
好强啊
我好弱啊啊啊
入坑半年多了
感觉良好
因为如果我现在没有沉迷ACM
肯定已经沉溺于游戏了(大雾)
Code of AC:
#include<iostream>
using namespace std;
const int N=120;
const int inf=1<<30;
int A[N],B[N],DP[N][N][2];
int main(){
int n;
cin>>n;
char op;
for(int i=1;i<=n;++i){
cin>>op;
if(op=='x') B[i]=B[n+i]=1;
cin>>A[i];
A[n+i]=A[i];
}
for(int i=1;i<=2*n;++i) DP[i][i][1]=DP[i][i][0]=A[i];
for(int i=1;i<2*n;++i){
for(int j=1;j+i<=2*n;++j){
DP[j][i+j][0]=inf;
DP[j][i+j][1]=-inf;
for(int k=j;k<i+j;++k){
int Min=inf;
int Max=-inf;
if(B[k+1]){
Min=min(min(DP[j][k][0]*DP[k+1][i+j][0],DP[j][k][0]*DP[k+1][i+j][1]),
min(DP[j][k][1]*DP[k+1][i+j][0],DP[j][k][1]*DP[k+1][i+j][1]));
Max=max(max(DP[j][k][0]*DP[k+1][i+j][0],DP[j][k][0]*DP[k+1][i+j][1]),
max(DP[j][k][1]*DP[k+1][i+j][0],DP[j][k][1]*DP[k+1][i+j][1]));
}
else{
Min=min(min(DP[j][k][0]+DP[k+1][i+j][0],DP[j][k][0]+DP[k+1][i+j][1]),
min(DP[j][k][1]+DP[k+1][i+j][0],DP[j][k][1]+DP[k+1][i+j][1]));
Max=max(max(DP[j][k][0]+DP[k+1][i+j][0],DP[j][k][0]+DP[k+1][i+j][1]),
max(DP[j][k][1]+DP[k+1][i+j][0],DP[j][k][1]+DP[k+1][i+j][1]));
}
DP[j][i+j][0]=min(DP[j][i+j][0],Min);
DP[j][i+j][1]=max(DP[j][i+j][1],Max);
}
}
}
int ans=-inf;
for(int i=1;i<=n;++i) ans=max(ans,DP[i][i+n-1][1]);
cout<<ans<<endl;
int flag=0;
for(int i=1;i<=n;++i){
if(ans==DP[i][i+n-1][1]){
if(flag) cout<<" ";
flag=1;
cout<<i;
}
}
cout<<endl;
}