标签:templateinline return int NOI1995 P1880 char isdigit dp getchar
嗯所以这题利用决策的单调性来减少k断点的枚举次数。具体看lyd书。这部分很生疏,但是我还是选择先不管了。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef double db; 5 template<typename T>inline char MIN(T&A,T B){return A>B?A=B,1:0;} 6 template<typename T>inline char MAX(T&A,T B){return A<B?A=B,1:0;} 7 template<typename T>inline T _min(T A,T B){return A<B?A:B;} 8 template<typename T>inline T _max(T A,T B){return A>B?A:B;} 9 template<typename T>inline T read(T&x){ 10 x=0;int f=0;char c;while(!isdigit(c=getchar()))if(c=='-')f=1; 11 while(isdigit(c))x=x*10+(c&15),c=getchar();return f?x=-x:x; 12 } 13 const int N=200+7,INF=0x3f3f3f3f; 14 int p[N][N],Fmin[N][N],Fmax[N][N],sum[N],a[N]; 15 int n; 16 17 int main(){//freopen("tmp.in","r",stdin);freopen("tmp.out","w",stdout); 18 read(n); 19 for(register int i=1;i<=n;++i)a[i+n]=read(a[i]); 20 for(register int i=1;i<(n<<1);++i)sum[i]=sum[i-1]+a[i],p[i][i]=i; 21 for(register int i=(n<<1)-1;i;--i){ 22 for(register int j=i+1;j<(n<<1);++j){ 23 Fmax[i][j]=_max(Fmax[i+1][j],Fmax[i][j-1])+sum[j]-sum[i-1];Fmin[i][j]=INF; 24 for(register int k=p[i][j-1];k<=p[i+1][j];++k) 25 if(MIN(Fmin[i][j],Fmin[i][k]+Fmin[k+1][j]+sum[j]-sum[i-1]))p[i][j]=k; 26 if(!(Fmin[i][j]^INF))Fmin[i][j]=0; 27 } 28 } 29 Fmin[0][0]=INF; 30 for(register int i=1;i<=n;++i)MIN(Fmin[0][0],Fmin[i][i+n-1]),MAX(Fmax[0][0],Fmax[i][i+n-1]); 31 printf("%d\n%d\n",Fmin[0][0],Fmax[0][0]); 32 return 0; 33 }
标签:templateinline,return,int,NOI1995,P1880,char,isdigit,dp,getchar 来源: https://www.cnblogs.com/saigyouji-yuyuko/p/10486298.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。