HDU 4283 (DP)

  题意很纠结。。。说的是1...n这些人登台,每个人有个吊丝值D[i],如果i号人第k个登台,那么他的愤怒值就是(k-1)*D[i]。现在有一个栈,可以先把i前边的人依次次进栈,然后让第i号人登台,然后在选择是栈里的同学登台还是i以后的同学登台,这样很多种情况会得到很多总愤怒值。求最小的总愤怒值。。。。

  n<=100,暴力肯定不行。3^100....只能考虑dp,(贪心直接忽略-_-!)。想了半天一直在考虑怎么保存被访问的状态。。。所以从昨天晚上到今天一直没什么进展,无奈看了看解题报告。。设计思路确实很巧妙。。。

  dp[i][j]表示区间[i, j]的最优值,设[i, j]上i是第k个访问,那么从i往后的 [i + 1, i + k - 1]这k-1个数肯定是要先于i被访问,i后面的数[i + k, j]当然要在i后被访问,因为[i + k, j]前面有k个登台,所以后面的愤怒值要增加 sigma(i + k, j)*k.

转移方程就出来了。。

dp[i][j] = min{dp[i][j], (k-1)*D[i] + dp[i+1][i + k - 1] + dp[i+k][j] + k*sigma(i + k, j)};

记忆化搜索可破。。。

posted @ 2012-09-12 20:57  AC_Von  阅读(259)  评论(0编辑  收藏  举报