• hdu4283 You Are the One


    题目链接:https://vjudge.net/problem/HDU-4283

    题意:n个人,每个人有一个值di,如果他是第k个上场的,那么他会产生(k-1)*di的不开心值。给定一个栈重新排列这n个人,求最小的不开心值

    这题的方程有点玄学......显然贪心是不行的,因为这个栈不能任意调换顺序。设f[i][j]表示将i到j的人放到栈里再出栈的最小值(这儿就把i想成栈中的第一个人,先不考虑i前面的人)。显然i会先进栈,并且i可以在i到j的任意一个位置出栈,于是可以枚举i出栈的位置,从i到j一共有j-i+1种可能,假设i是第k个出栈的,则有如下的转移方程:

    f[i][j]=min(f[i][j],f[i+1][i+k-1]+(k-1)*di+f[i+k][j]+k*(s[j]-s[i+k-1])),这儿的最后一项就是把前i+k个人对i+k到j产生的影响加起来

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=110;
    int d[N],f[N][N],s[N],t,n,i,j,k,l,T;
    /* f[i][j]表示i~j出栈的最小值(不考虑i~j之前的数)*/ 
    
    int main(){
    	scanf("%d",&t); T=t;
    	while (t--){
    	  memset(f,0,sizeof(f));
    	  scanf("%d",&n);
    	  for (i=1;i<=n;i++) {
    	  	scanf("%d",&d[i]); s[i]=s[i-1]+d[i]; 
    	  }
    	  for (l=1;l<n;l++)
    	    for (i=1;i<n;i++){
    	      j=i+l;
    	      if (j>n) continue;
    	      f[i][j]=1e7;
    	      for (k=1;k<=j-i+1;k++) //枚举Di的位置,从i~j共j-i+1种 
    	        f[i][j]=min(f[i][j],f[i+1][i+k-1]+(k-1)*d[i]+f[i+k][j]+k*(s[j]-s[i+k-1])); //*
    		}
    	  printf("Case #%d: %d
    ",T-t,f[1][n]);
    	}
    	return 0;
    }

    到这儿kuangbin22也大致刷完了,除了zoj3537要用点凸包的东西(咕咕咕)。说实话自己只独立做出来简单的,大部分是想了挺久,然后要瞅一眼提示做出来;像hdu2476这种先刷空串再递推的是看了题解之后写的了,不知道是怎么想出来的。有空把kuangbin 5 12 22写个小总结,7也在进行中......

  • 相关阅读:
    2015 11月30日 一周工作计划与执行
    2015 11月23日 一周工作计划与执行
    js 时间加减
    unix高级编程阅读
    2015 11月16日 一周工作计划与执行
    2015 11月9日 一周工作计划与执行
    python2与python3差异,以及如何写两者兼容代码
    property属性
    js刷新页面函数 location.reload()
    常用表单验证
  • 原文地址:https://www.cnblogs.com/edmunds/p/13693425.html
Copyright © 2020-2023  润新知