意思什么的在注释中......
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int dp[101][101][101];
int MAXN = 0x3f3f3f3f;
int N;
int diaoser[101];
inline int min( int a, int b ){
return ( a < b ? a : b );
}
int solve_dp( int first, int last, int k ){// k 表示区间[first,last]中的一个出栈的将是总的顺序中的第k个
if( first == last ){
return diaoser[first] * ( k - 1 );
}
if( first > last ){
return 0;
}
if( dp[first][last][k] != MAXN ){//如果没有将会超时
return dp[first][last][k];
}
//在区间[first,last]中
for( int i = first; i <= last; i++ ){
int cur = diaoser[first] * ( i - first + k - 1 );// 第fist个第i个出栈将产生的屌丝值
int A = solve_dp( first + 1, i, k );//第first第i个出栈说明 fist + 1 到i 将在first之前出栈 求出它们的屌丝值之和
int B = solve_dp( i + 1, last, k + i - first + 1 );//第first第i个出栈说明 i + 1 到 last 将在first之后出栈 求出它们的屌丝值之和
dp[first][last][k] = min( dp[first][last][k], cur + A + B );
}
return dp[first][last][k];
}
int main(){
int T, Case = 1, ans;
cin >> T;
while( T-- ){
memset( dp, 0x3f, sizeof( dp ) );
cin >> N;
for( int i = 1; i <= N; i++ ){
cin >> diaoser[i];
}
ans = solve_dp( 1, N, 1 );
printf( "Case #%d: %d\n", Case++, ans );
}
return 0;
}