dp 状态转移方程 dp[i][j]=max(dp[i][j],dp[i][k](*/+)dp[k+1][j]) , dp[i][j]=min(dp[i][j],dp[i][k](*/+)dp[k+1][j]) 和uva 上的10700非常相似 但是 spoj上有数字0所以
就不能用简单的栈的思想来做了 选择用dp来做
#include <algorithm> #include <cstring> #include <iostream> #include <cstdio> using namespace std; long long a[110]; long long b[110]; long long dp[110][110]; bool vis[110][110]; char s[110]; int top; void solve() { int len=strlen(s); long long n=0; for(int i=0; i<len; i++) { if(s[i]>='0' && s[i]<='9') n=n*10+s[i]-'0'; else if(s[i]=='+') { a[top]=n; b[top++]=1; n=0; } else if(s[i]=='*') { a[top]=n; b[top++]=0; n=0; } } a[top]=n; } long long dfs1(int x, int y) { if(dp[x][y]!=-1) return dp[x][y]; if(x==y) return dp[x][y]=a[x]; dp[x][y]=0; for(int i=x; i<y; i++) { if(b[i]) dp[x][y]=max(dp[x][y],dfs1(x,i)+dfs1(i+1,y)); else if(!b[i]) dp[x][y]=max(dp[x][y],dfs1(x,i)*dfs1(i+1,y)); } return dp[x][y]; } long long dfs(int x, int y) { if(vis[x][y]) return dp[x][y]; if(x==y) return dp[x][y]=a[x]; vis[x][y]=true; dp[x][y]=((long long)1<<62); for(int i=x; i<y; i++) { if(b[i]) dp[x][y]=min(dp[x][y],dfs(x,i)+dfs(i+1,y)); else if(!b[i]) dp[x][y]=min(dp[x][y],dfs(x,i)*dfs(i+1,y)); } return dp[x][y]; } int main() { int t; // freopen("s.txt","r",stdin); scanf("%d",&t); while(t--) { memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); top=0; scanf("%s",s); solve(); memset(dp,-1,sizeof(dp)); dfs1(0,top); cout << dp[0][top] << ' '; memset(dp, 0, sizeof(dp)); memset(vis, false, sizeof(vis)); dfs(0,top); cout << dp[0][top] << endl; } return 0; }