P1156-스팸함정【dp】

8869 단어 dp

본제


평가 레코드:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1156

제목의 대의.


쓰레기가 몇 개 있는데, t i ti ti 시 드랍, 다활 선택 가능 f i fifi 하늘, hi hi Hi 높이, 높이가 D D D에 도달하면 탈출할 수 있다. 가장 짧은 탈출 시간을 구하고 탈출할 수 없으면 최대 며칠을 구한다.

문제풀이의 방향


fi, jf 로{i,j}fi,j는 제ii개 쓰레기를 사용하는데 높이 jj가 가장 오래 살 수 있는지를 나타낸다.그리고 각 쓰레기 fi, j = m a x {f i -3 1, j -3 h i, f i -3 1, j + f i} (f i -3 1, j > = t i) f{i,j}=max\{f_{i-1,j-h_i},f_{i-1,j}+f_i\}(f_{i-1,j}>=t_i) fi,j​=max{fi−1,j−hi​​,fi−1,j​+fi​}(fi−1,j​>=ti​)

code

#include
#include
using namespace std;
struct node{
    int t,c,h;
}a[101];
int d,g,f[101],maxs;
bool cmp(node x,node y)
{return x.t<y.t;}
int main()
{
    scanf("%d%d",&d,&g);
    for(int i=1;i<=g;i++)
      scanf("%d%d%d",&a[i].t,&a[i].c,&a[i].h);
    sort(a+1,a+1+g,cmp);//     
    f[0]=10;//      
    for(int i=1;i<=g;i++)
    {
        int t=a[i].t,c=a[i].c,h=a[i].h;
        for(int j=d;j>=0;j--)
          if(f[j]>=t)//          
          {
          	if(j+h>=d)//    
          	{
          		printf("%d",t);
          		return 0;
            }
            f[j+h]=max(f[j+h],f[j]);//    
            f[j]+=c;//    
          }
    }
    printf("%d",f[0]);//              
}

좋은 웹페이지 즐겨찾기