一个裸的区间dp(但是我不会)
这个题我的思路(在看了对区间dp的解释之后)是这样的
———————————————————————
先定义数组dp[][],w[][]
dp[i][j]表示区间[i,j]合并的最小花费,w[i][j]表示区间[i,j]内所有石子合并成一堆之后的总重量
- 预处理数组,dp[i][i]=0,dp[i][j](i≠j)=INF,读入w[i][i],并计算w[i][j](前缀和)
- 划分区间,区间长度从小到大遍历区间,合并每个小区间的最优解,并以此得出整体最优解
———————————————————————
代码如下(写的很丑,网上比我的代码好看的比比皆是) -
#include <iostream> #include <cstring> using namespace std; int main() { int n,dp[101][101],w[101][101]; cin>>n; memset(dp,127,sizeof(dp)); for(int i=1;i<=n;++i) dp[i][i]=0; for(int i=1;i<=n;++i) cin>>w[i][i]; for(int i=1;i<=n;++i) for(int j=i+1;j<=n;++j) { w[i][j]=w[i][j-1]+w[j][j]; //cout<<i<<" "<<j<<" "<<w[i][j]<<'\n'; } for(int len=1;len<=n;++len) { for(int i=1,j;(j=i+len)<=n;++i) { for(int k=i;k<j;++k) { dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+w[i][k]+w[k+1][j]); } } } cout<<dp[1][n]; return 0; }
愿天堂没有dp