您的位置:首页 > 其它

区间dp(poj1651)

2016-06-14 20:47 337 查看
记住就是这样的状态ap【i】【j】!!区间dp欧~

dp【i】【j】表示,把i——j的所有数字都取出的最小代价

枚举k(属于i~j),也就是枚举此刻现在我要取出的第几个数字

然后出转移方程 dp【i】【j】=min(dp【i】【j】,dp【i】【k-1】+dp【k+1】【j】+a【k】*a【i-1】*a【j+1】);

最终答案,dp【2】【n-1】(因为最前面最后面的不选)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int inf=0x3f3f3f3f;
int n,a[109],dp[109][109];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=n-1;i>1;i--)
{
dp[i][i]=a[i]*a[i-1]*a[i+1];
for (int j=i+1;j<n;j++)
{
dp[i][j]=inf;
for (int l=i;l<=j;l++)
dp[i][j]=min(dp[i][j],dp[i][l-1]+dp[l+1][j]+a[l]*a[i-1]*a[j+1]);//转移方程
}
}
printf("%d",dp[2][n-1]);
return 0;
}

总算做了个简单的了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: