HihoCoder - 1636——Pangu and Stones (區間DP)

題目鏈接:https://vjudge.net/contest/329530#problem/J

dp【i】【j】【k】:i,j表示區間【i,j】,k表示分爲k堆石子。dp表示區間【i,j】分爲k堆石子的最小价值

#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
int n,l,r;
int A[110],dp[110][110][110];
int main()
{
    while(~scanf("%d%d%d",&n,&l,&r))
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&A[i]),A[i] += A[i-1];
        memset(dp,0x3f,sizeof(dp));
        for(int i=1; i<=n; i++)
        {
            for(int j=i; j<=n; j++)
            {
                dp[i][j][j-i+1]=0;
            }
        }
        for(int len=1; len<=n; len++)
        {
            for(int i=1; i+len<=n; i++)
            {
                int j=i+len;
                for(int v=i; v<j; v++)
                {
                    for(int k=l-1; k<=r-1; k++)
                    {
                        dp[i][j][1]=min(dp[i][j][1],dp[i][v][1]+dp[v+1][j][k]+A[j]-A[i-1]);
                    }
                }
                for(int k=2; k<=j; k++)
                {
                    for(int v=i; v<j; v++)
                    {
                        dp[i][j][k]=min(dp[i][j][k],dp[i][v][1]+dp[v+1][j][k-1]);
                    }
                }
            }
        }
        if(dp[1][n][1]>=1e9)
            printf("0\n");
        else
            printf("%d\n",dp[1][n][1]);
    }
}
/*
7 4 4
4 8 6 1 2 4 6
5 3 3
1 2 3 4 5
*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章