poj 1651 区间DP

来源:互联网 发布:外国人吃西洋参吗 知乎 编辑:程序博客网 时间:2024/04/28 09:39

这一题,首先可以知道的是 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 0x3f3f3f3fint 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;}

 

0 0