BZOJ1270: [BeijingWc2008]雷濤的小貓 DP
阿新 • • 發佈:2019-01-25
題目大意:一隻貓,可以在若干顆數之間瞎蹦,每次瞎蹦需要下降k的長度,到達一個點就獲得該點的收益,問最大收益。
題解:SBDP,F1[i]表示高度為i的時候最大值是多少,F2[i]表示在第i棵樹上時的最大權值為多少,隨便寫寫就行了。
#include<bits/stdc++.h>
using namespace std;
int mapp[5000][5000];
int f1[5000];
int f2[5000];
int main()
{
int n,h,d;
scanf("%d%d%d",&n,&h,&d);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
for(int j=1;j<=x;j++)
{
int y;
scanf("%d",&y);
mapp[i][y]++;
}
}
for(int i=h;i>=1;i--)
{
int temp=i+d>h?0:f1[i+d];
for(int j=1;j<=n;j++)
{
f2[j]=max(f2[j],temp)+mapp[j][i];
f1[i]=max(f1[i],f2[j]);
}
}
cout <<f1[1];
return 0;
}