码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1651 (区间DP)

时间:2014-10-25 13:07:13      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   os   ar   for   strong   sp   

题目链接http://poj.org/problem?id=1651

题目大意:加分取牌。如果一张牌左右有牌则可以取出,分数为左牌*中牌*右牌。这样最后肯定还剩2张牌。求一个取牌顺序,使得加分最少。

解题思路

矩阵链乘的变种题。

假设有10、20、30、40、50五张牌。

如果我想要最后取30,则应该先取20、40,这样就还剩10、30、50三张牌了。

不难发现取20是dp[i][k]部分,取40是dp[k][j]部分,最后剩下的就是i、k、j三张牌。

DP边界:无

因为是算加分,区间间隔0、1的情况下dp[i][j]都无法加分,所以默认保留0即可,无须特别预处理。

最后ans=dp[1][n]。

 

#include "cstdio"
#include "iostream"
using namespace std;
#define inf 0x3f3f3f3f
int dp[105][105],card[105];
int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&card[i]);
    for(int p=2;p<=n;p++)
    {
        for(int i=1;i<=n-p;i++)
        {
            int j=i+p;
            dp[i][j]=inf;
            for(int k=i+1;k<j;k++)
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+card[i]*card[k]*card[j]);
        }
    }
    printf("%d\n",dp[1][n]);
    return 0;
}

 

13156701 neopenx 1651 Accepted 176K 0MS C++ 664B 2014-07-24 14:03:01

 

POJ 1651 (区间DP)

标签:style   http   color   io   os   ar   for   strong   sp   

原文地址:http://www.cnblogs.com/neopenx/p/4049956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!