这一题,首先可以知道的是 1, N肯定是留到最后的,他们是不可能被拿走的,
如果你无法理解正推的话,可以这样想
当还有1.。。。N的时候,那么谁是最后一个被拿走的呢,假设是k的话,那么1到k k到N之间的一定要先拿走
那么dp【1】【N】 = min( dp【1】【k】 +dp【k】【N】 +cost )( 1 < k < N )
那么当a到b的时候也是类似 dp【1】【N】 = min( dp【a】【k】 +dp【k】【b】 +cost )( a < k < b )
然后我用记忆话搜索做的
AC代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX 0x3f3f3f3f
int N, num[110];
int dp[110][110];
int DFS( int a, int b ){
if( a == b - 1 ){
return 0;
}
if( dp[a][b] != -1 ){
return dp[a][b];
}
int ans = MAX;
for( int i = a + 1; i < b; i++ ){
ans = min( ans, DFS( a, i ) + DFS( i, b ) + num[a] * num[i] * num[b] );
}
return dp[a][b] = ans;
}
int main(){
while( scanf( "%d", &N ) != EOF ){
for( int i = 1; i <= N; i++ ){
scanf( "%d", &num[i] );
}
memset( dp, -1, sizeof( dp ) );
cout << DFS( 1, N ) << endl;
}
return 0;
}