最近几天身体不好,状态极差,抓紧时间调整自己!废话不多说,今天做了两个题目,一个是以前做过的,但是感觉运用的还不是那么熟悉,这几天基本上都是区间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;
}