小蒟蒻看到这个题又想不出贪心又想不到DP,就只好写了个分层图最长路的做法了,提交不了题解,就在讨论里面分享吧QAQ
#include<bits/stdc++.h>
using namespace std;
//我有个分层图的傻逼想法QAQ.
//dis[310][310][310],在第几个鱼塘,已经过了多久,当前塘钓了多少次了.
int n,h,st[310],d[310],t[310],dis[110][410][410];
char vis[110][410][410];
struct pos{int x,t,nt;};
queue<pos>q;
int main()
{
//cout<<sizeof(dis)/1024/1024<<" "<<sizeof(vis)/1024/1024;
cin>>n;
cin>>h;h*=12;
for(int i=1;i<=n;++i)
scanf("%d",st+i);
for(int i=1;i<=n;++i)
scanf("%d",d+i);
for(int i=1;i<n;++i)
scanf("%d",t+i);
q.push((pos){1,0,0});
while(!q.empty())
{
int u=q.front().x;
int kt=q.front().t;
int nkt=q.front().nt;q.pop();vis[u][kt][nkt]=0;
if(u+1<=n&&kt+t[u]<=h)
if(dis[u+1][kt+t[u]][0]<dis[u][kt][nkt])
{
dis[u+1][kt+t[u]][0]=dis[u][kt][nkt];
if(!vis[u+1][kt+t[u]][0])
q.push((pos){u+1,kt+t[u],0}),vis[u+1][kt+t[u]][0]=1;
}
if(kt+1<=h&&nkt+1<=h)
if(dis[u][kt+1][nkt+1]<dis[u][kt][nkt]+st[u]-d[u]*nkt)
{
dis[u][kt+1][nkt+1]=dis[u][kt][nkt]+st[u]-d[u]*nkt;
if(!vis[u][kt+1][nkt+1])
q.push((pos){u,kt+1,nkt+1}),vis[u][kt+1][nkt+1]=1;
}
}
//以上是SPFA
int maxa=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=h;++j)
{
maxa=max(dis[i][h][j],maxa);
}
cout<<maxa;
return 0;
}