不值得一看

Diddish 2016-11-10 10:58:49 2016-11-10 11:23:03

最美的塔,一个贪心结论+递推dp,

每次只需讨论当前位对于1的距离与它与它之前的所有的数距离的大小关系或前缀和大小关系

        f[0]:=0;
	g[0]:=0;
	for i:=1 to n do
	  begin
	    f[i]:=i-1;
	    g[i]:=sum[i];
	    for j:=0 to i-1 do
	      if ((f[j]+i-j-1<f[i])or(f[j]+i-j-1=f[i])and(sum[i]-sum[j]<g[i]))and(g[j]<=sum[i]-sum[j]) then
	        begin
	          g[i]:=sum[i]-sum[j];
	          f[i]:=f[j]+i-j-1;
	        end;
	  end;
f[0]=g[0]=0;
    for (int i =1;i <=n;++i)
    {
        f[i]=i-1; g[i]=sum[i];
        for (int j = 0;j<i;++j)
            if ((f[j]+i-j-1<f[i] || f[j]+i-j-1==f[i] && sum[i]-sum[j] < g[i]) 
                && g[j]<=sum[i]-sum[j])
               {
                     g[i] = sum[i] - sum[j];
                     f[i] = f[j]+i-j-1;
               }   
    }

每次满足条件的差分

(sum前缀和,读入时预处理)

for i:=1 to n do
	  begin
	    read(h);
	    sum[i]:=sum[i-1]+h;
	  end;
for (int i = 1;i<=n;++i)
    {
        cin>>h;
        sum[i]=sum[i-1]+h;
    }

最后得到的结果即递推到的f[n]即是所求解

{某些方面不够完善,见谅}

共 1 条回复

schrodingerzhu

我是最强的