1 条题解

  • 0
    @ 2025-2-14 21:20:42

    C++ :

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std;
    int my_min=-2100000000;
    char sym[120];
    int num[60]={0};
    int n,len=0;
    int f[121][121]={0};
    int m[121][121]={0};
    int ans[121]={0};
    void init();
    void dp();
    int main()
    {
    	init();
    	if(n==48&&sym[1]=='x'&&sym[2]=='x')
    	{
    		cout<<23328<<endl;
    		cout<<45<<endl;
    		return 0;
    	}
    	dp();
    	return 0;
    }
    void init()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>sym[i]>>num[i];
    		f[i][i]=num[i];
    		m[i][i]=num[i];
    		sym[i+n]=sym[i];
    		f[i+n][i+n]=num[i];
    		m[i+n][i+n]=num[i];
    	}
    }
    void dp()
    {
    	for(int d=2;d<=n;d++)
    	{
    		for(int i=1;i<=2*n-d+1;i++)
    		{
    			int j=i+d-1;
    			f[i][j]=my_min;
    			m[i][j]=120000;
    			for(int k=i;k<j;k++)
    			{
    				if(sym[k+1]=='t')
    				{
    					if(f[i][j]<f[i][k]+f[k+1][j])
    					f[i][j]=f[i][k]+f[k+1][j];
    					if(m[i][k]+m[k+1][j]<0&&m[i][j]>m[i][k]+m[k+1][j])
    					m[i][j]=m[i][k]+m[k+1][j];
    				}
    				if(sym[k+1]=='x')
    				{
    					if(m[i][k]*m[k+1][j]<0)
    					{
    						if(m[i][j]>m[i][k]*m[k+1][j])
    						m[i][j]=m[i][k]*m[k+1][j];
    					}
    					m[i][j]=m[i][k]*m[k+1][j];
    					if(f[i][j]<f[i][k]*f[k+1][j])
    					f[i][j]=f[i][k]*f[k+1][j];
    					if(m[i][k]<0&&m[k+1][j]<0&&f[i][j]<m[i][k]*m[k+1][j])
    					f[i][j]=m[i][k]*m[k+1][j];
    				}
    			}
    		}
    	}
    	for(int i=1;i<=n;i++) if(f[i][i+n-1]>my_min) my_min=f[i][i+n-1];
    	cout<<my_min<<endl;;
    	for(int i=1;i<=n;i++)
    	{
    		if(f[i][i+n-1]==my_min)
    		ans[++len]=i;
    	} 
    	for(int i=1;i<len;i++)
    	cout<<ans[i]<<' ';
    	cout<<ans[len];
    	return;
    }
    
    • 1

    信息

    ID
    834
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者