区间dp与一般的dp有所区别,若使用递推的方法,需要注意根据dp[i][j]
中j-i递增的顺序来递推。
#include <cstdio>#include <iostream>#include <cstring>#include <string>#include <map>#include <cmath>#define INF 1<<30using namespace std;int p[105],f[105][105];int min(int a, int b){return a<b?a:b;}int main(){int n;while(~scanf("%d",&n)&&n){for(int i=0; i<=n; i++)cin>>p[i];for(int i=1; i<=n; i++){for(int j=0; j<=n; j++)f[i][j]=INF;f[i][i]=0;f[i][i+1]=p[i-1]*p[i]*p[i+1];}for(int l=2; l<=n; l++) ///递推的过程 记住要按照j-i递增的顺序递推for(int i=1; i+l<=n; i++){int j=i+l;for(int k=i; k<=j; k++)f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+p[i-1]*p[k]*p[j]);}cout<<f[1][n]<<endl;}return 0;}
#include <cstdio>#include <iostream>#include <cstring>using namespace std;#define maxn 100000int p[55],dp[55][55];int main(){int L,n;while(cin>>L&&L){memset(dp,0,sizeof(dp));cin>>n;for(int i=1; i<=n; i++)cin>>p[i];p[0]=0,p[n+1]=L;for(int l=2; l<=n+1; l++)for(int i=0; i+l<=n+1; i++){int j=i+l;dp[i][j]=maxn;for(int k=i; k<j; k++)dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+p[j]-p[i]);}cout<<"The minimum cutting is "<<dp[0][n+1]<<"."<<endl;}}
原文地址:http://blog.csdn.net/dojintian/article/details/40979449