区间dp与一般的dp有所区别,若使用递推的方法,需要注意根据dp[i][j]
中j-i递增的顺序来递推。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <map>
#include <cmath>
#define INF 1<<30
using 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 100000
int 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