20180531

最近几天身体不好,状态极差,抓紧时间调整自己!废话不多说,今天做了两个题目,一个是以前做过的,但是感觉运用的还不是那么熟悉,这几天基本上都是区间DP的题目,下面说一下今天晚上做的一个区间DP:

题意:

有n个苹果,和一个数k,第i个苹果的重量是k+i(1<=i<=n). 已知其中只有一个苹果是甜的,所有比它重量轻的都是苦的,比它重的都是酸的。问使得吃的苹果最少就可以找到甜苹果。

思路:

一开始是联系不到区间DP上的,后来看了一下题解,大概明白。设dp[i][j]为i-j区间内的最佳方案下的重量,我们可以选择i-j中的一个k吃掉,那么对于i到k-1,k+1到j,每个吃的都得加上v[k],dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]);

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define INF 0x7ffffff
int num[505];
int dp[505][505];
int main()
{
    int T,n,k;
    int cas=0;
    cin>>T;
    while(T--)
    {
        cas++;
        cin>>n>>k;
        for(int i=1;i<=n;i++) num[i]=i+k;
        memset(dp,0,sizeof(dp));
        for(int d=2;d<=n;d++) //lllen
        {
            for(int i=1;i+d-1<=n;i++)  ///start
            {
                int s=i;
                int e=i+d-1;
                dp[s][e]=INF;
                for(int j=s;j<=e;j++)
                {
                    dp[s][e]=min(dp[s][e],dp[s][j-1]+dp[j+1][e]+num[j]*d);
                }
            }
        }
        printf("Case %d: %d\n",cas,dp[1][n]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_37668729/article/details/80531046
今日推荐