acwing283 区间dp

总结:
这个题开始我用scanf %c来录入字符,但是最后错误,发现,scanf是可以吃掉空格的,所以当用scanf录入字符串时,要用getchar()吃掉空格
还有就是区间dp,就是划分区间,求里面的最值,然后扩大区间

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>

using namespace std;
const int INF=32767,N=110;
int num[N];
char op[N];
int f[N][N],g[N][N];
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        cin>>op[i]>>num[i];
        op[i+n]=op[i];
        num[i+n]=num[i];
    }
    for(int len=1;len<=n;len++)
    {
        for(int l=1;l+len-1<=2*n;l++)
        {
            int r=l+len-1;
            if(len==1)
                f[l][r]=g[l][r]=num[l];
            else
            {
                f[l][r]=-INF,g[l][r]=INF;
                for(int k=l;k<r;k++)
                {
                    char nowOp=op[k+1];
                    int maxl=f[l][k];
                    int maxr=f[k+1][r];
                    int minl=g[l][k];
                    int minr=g[k+1][r];
                    if(nowOp=='t')
                        {
                            f[l][r]=max(f[l][r],maxl+maxr);
                            g[l][r]=min(g[l][r],minl+minr);
                        }
                    else
                        {
                            int x1=maxl*maxr,x2=maxl*minr,x3=minl*maxr,x4=minl*minr;
                            f[l][r]=max(f[l][r],max(max(x1,x2),max(x3,x4)));
                            g[l][r]=min(g[l][r],min(min(x1,x2),min(x3,x4)));
                        }
                }
            }
        }
    }
    int res=-INF;
    for(int i=1;i<=n;i++)
        res=max(res,f[i][i+n-1]);
    printf("%d\n",res);
    for(int i=1;i<=n;i++)
    	if(res==f[i][i+n-1])
    		printf("%d ",i);
    		
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值