UVa10003 cutting sticks

来源:互联网 发布:js input 光标位置 编辑:程序博客网 时间:2024/05/09 08:28

区间dp,基本裸题
dp[i][j] = dp[i][k] + dp[k][j] + val(j-i) ;
枚举给定的点即可

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#define min(a,b) (a<b?a:b)#define FOR(a,i,b) for( i = a ; i <= b ; ++i )#define CLR(arr,x) memset(arr,x,sizeof(arr))using namespace std;const int maxn = 100 ;const int inf = 0x3fffffff ;int a[maxn] , b[maxn] ;int temp[maxn][maxn] ;int n ,k;void init() {    CLR(a,0) ;    CLR(temp,0) ;}int dp(int l , int r ) {    if( r-l==1 ) return 0 ;    int& ans = temp[l][r] ;    if( ans > 0 ) return ans ;    ans = inf ;    for( int i = l+1 ; i < r ; ++i ) {        ans = min(ans, dp(l,i)+dp(i,r)+a[r]-a[l]) ;    }    return ans ;}void scan(){    scanf("%d",&k) ;    int i ;    a[0] = 0;    a[k+1] = n ;    FOR(1,i,k){        scanf("%d",&a[i]) ;    }    dp(0,k+1) ;}int main() {    while(~scanf("%d",&n),n) {        init() ;        scan() ;        printf("The minimum cutting is %d.\n",temp[0][k+1]) ;    }    return 0 ;}
0 0
原创粉丝点击