zoukankan      html  css  js  c++  java
  • [IOI1998]Polygon

    区间DP
    赶紧补一补QwQ
    因为它可能有负数,那么我们就维护两个值,mx和mn
    说不定哪一天负数就变成正数了呢2333
    然后环上区间DP操作一下

    #include <bits/stdc++.h>
    using namespace std;
    const int inf=0x3f3f3f3f;
    int n;
    int a[55];
    char c[55];
    int f[55][55][2];
    int cal(int a,char b,int c) {
    	if(b=='t') return a+c;
    	return a*c;
    }
    int main() {
    	scanf("%d",&n);
    	for(int i=0; i<n; i++)
    		cin>>c[i]>>a[i],f[i][i][1]=f[i][i][0]=a[i];
    	for(int l=1; l<n; l++) {
    		for(int i=0; i<n; i++) {
    			int j=(i+l)%n,mx=-inf,mn=inf;
    			for(int k=0; k<l; k++) {
    				int p1=(i+k)%n,p2=(i+k+1)%n;
    				mx=max(mx,cal(f[i][p1][0],c[p2],f[p2][j][0]));
    				mx=max(mx,cal(f[i][p1][1],c[p2],f[p2][j][1]));
    				mn=min(mn,cal(f[i][p1][1],c[p2],f[p2][j][1]));
    				mn=min(mn,cal(f[i][p1][0],c[p2],f[p2][j][0]));
    			}
    			f[i][j][0]=mx;
    			f[i][j][1]=mn;
    		}
    	}
    	int	ans=-inf;
    	for(int i=0; i<n; i++) {
    		int j=(i+n-1)%n;
    		ans=max(ans,f[i][j][0]);
    	}cout<<ans<<endl;
    	for(int i=0;i<n;i++){
    		if(ans==f[i][(i+n-1)%n][0]) cout<<i+1<<' ';
    	}
    	
    }
    
    我是咸鱼。转载博客请征得博主同意Orz
  • 相关阅读:
    包导入基础知识
    怎么创建模块?
    reload基础
    重载模块概念及意义
    导入和作用域 #596
    属性名的点号运算
    模块命名空间
    from会存在潜在的陷阱
    如何通过from语句调用模块的变量名?
    如何调用模块的变量名?
  • 原文地址:https://www.cnblogs.com/sdfzhsz/p/9260382.html
Copyright © 2011-2022 走看看