题意:n个人排队,每个人有一个权值val[i]。从第一个人开始出队,进入一个栈中,每次可以留在栈中或者从栈中移出一个,如果第 i 个人是第k个出栈的,那么有sum+=(k-1)*val[i],求是的sum最小。
f[i][j]表示区间第 i 个人到第 j 个人sum的最小值,那么每次转移的时候我们只要枚举第 i 个人是什么时候出的栈就可以了,假设第 i 个人是第k个出的栈,那么f[i][j]=Min{ f[i+1][i+k-1]+(k-1)*num[i]+f[i+k][j]+k*(sum[j]-sum[i+k-1]) | 1<=k<=j-i+1 }。
1 //STATUS:C++_AC_0MS_276KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #include 20 #include 21 #include 22 #include