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;
}
View Code

 

posted on 2013-08-09 21:06  风流monkey  阅读(161)  评论(0编辑  收藏  举报