递推-hdu-6024-Building Shops

来源:互联网 发布:最简单的数据库软件 编辑:程序博客网 时间:2024/05/21 12:48

题意:在n个教学楼上建造糖果店,如果在那里建造,那么价值就是y,否则的话,就是他到左边第一个糖果店的距离。注意:如果某一个地方没有糖果店,那么他的左边一定有糖果店,所以第一个一定有糖果店。
递推,维护最大值。
关键是 状态的转移:
当他建造时可以知道,毕竟做过之类的题。
在他不可以的时候,只能从第一个见的地方转移。但是要怎么转移呢,我想了好久这个问题,因为无法判断当前点有没有被建造,可能会出现非法的情况。
很值的思考。

#include <iostream>#include <cstdio>#include <vector>#include <cstring>#include <algorithm>/*一个递推,有下列的条件,*/using namespace std;const int maxn=3002;typedef long long ll;struct Node{  ll x;   ll y;};int cmp2(Node a, Node b){  return a.x<b.x;}int main(){  int m;   ll dp[maxn][2];   ll a1,b;   ll ans;   Node a[maxn];   while(~scanf("%d",&m))    {   for(int i=1;i<=m;i++)         {   scanf("%lld%lld",&a1,&b);            a[i].x=a1;             a[i].y=b;         }         sort(a+1,a+m+1,cmp2);         memset(dp,0x3f,sizeof(dp));         dp[0][0]=0;         dp[0][1]=0;        for(int i=1;i<=m;i++)        {  dp[i][1]=min(dp[i-1][1],dp[i-1][0])+a[i].y;          ans=0;          for(int j=i-1;j>=1;j--)          { ans+=(i-j)*(a[j+1].x-a[j].x);//每次求他们之间的差值,如果是第二个是空的,              dp[i][0]=min(dp[i][0],dp[j][1]+ans);          }        }        ll all=min(dp[m][1],dp[m][0]);       printf("%lld\n",all);    }}
0 0
原创粉丝点击