poj 1179 动态规划

来源:互联网 发布:贵州中小企业数据统计 编辑:程序博客网 时间:2024/04/28 17:19

求最大,同时维护最小。

#include <iostream>#include <algorithm>#include <fstream>#include <string>using namespace std;#define N 50#define inf 10000000string s[N+5];int f[N+5][N+5],g[N+5][N+5];int main(){    freopen("1.in","r",stdin);    freopen("1.out","w",stdout);    int n;    cin>>n;    for (int i=0;i<n;i++){        int j;        cin>>s[(i+1-1)%n+1]>>j;        f[(i+2-1)%n+1][0] = g[(i+2-1)%n+1][0] = j;    }    for (int i=1;i<=n;i++)        for (int len=1;len<n;len++)            f[i][len]=-inf, g[i][len]=inf;    for (int len=1;len<n;len++){        for (int i=1;i<=n;i++){            for (int t=0;t<len;t++){                if (s[(i+t-1)%n+1][0]=='t'){                    if (f[i][len]<f[i][t]+f[(i+t+1-1)%n+1][len-t-1])                        f[i][len]=f[i][t]+f[(i+t+1-1)%n+1][len-t-1];                    if (g[i][len]>g[i][t]+g[(i+t+1-1)%n+1][len-t-1])                        g[i][len]=g[i][t]+g[(i+t+1-1)%n+1][len-t-1];                }                else {                    int Max=max(max(f[i][t]*f[(i+t+1-1)%n+1][len-t-1],                                    f[i][t]*g[(i+t+1-1)%n+1][len-t-1]),                                max(g[i][t]*f[(i+t+1-1)%n+1][len-t-1],                                    g[i][t]*g[(i+t+1-1)%n+1][len-t-1])                                );                    int Min=min(min(f[i][t]*f[(i+t+1-1)%n+1][len-t-1],                                    f[i][t]*g[(i+t+1-1)%n+1][len-t-1]),                                min(g[i][t]*f[(i+t+1-1)%n+1][len-t-1],                                    g[i][t]*g[(i+t+1-1)%n+1][len-t-1])                                );                    if (f[i][len]<Max) f[i][len]=Max;                    if (g[i][len]>Min) g[i][len]=Min;                }            }        }    }    int ans=-inf;    for (int i=1;i<=n;i++)        if (ans<f[i][n-1]) ans=f[i][n-1];    cout<<ans<<endl;    int sum=0;    for (int i=2;i<=n+1;i++)        if (ans==f[(i-1)%n+1][n-1]){            if (sum) cout<<' ';            cout<<i-1;            sum++;        }    cout<<endl;    return 0;}


原创粉丝点击