区间dp

来源:互联网 发布:淘宝网上怎么买二手货 编辑:程序博客网 时间:2024/06/01 08:24

题意

合并一堆石子,每次只能合并相邻的两个/堆,合并的代价是参与合并的石子的权值和。问合并的最小代价

思路

dp,dp[i][j]为[i,j]区间rein石子合并所需的最少代价,num(i,j)为[i,j]区间内石子的权值和
转移方程

dp[i][j]=mink=0j1{dp[i][i+k]+dp[i+k+1][j]}+num(i,j)

代码里的转移方程做了一些改变来方便写,思路是一样的,写得比较丑

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long LL;const int maxn=105;int num[maxn];int dp[maxn][maxn];int n;int main(){    int in;    int T;    cin>>T;    while(T--){        scanf("%d",&n);        for(int i=1;i<=n;++i){            scanf("%d",&in);            num[i]=num[i-1]+in;        }        memset(dp,0x3f,sizeof(dp));        for(int i=1;i<=n;++i)dp[0][i]=0;        for(int i=1;i<=n;++i){            for(int j=1;j<=n;++j){                for(int k=0;k<i;++k){                    dp[i][j]=min(dp[i][j],dp[k][j]+dp[i-k-1][j+k+1]);                }                dp[i][j]+=num[j+i]-num[j-1];            }        }        printf("%d\n",dp[n-1][1]);    }    return 0;}
原创粉丝点击