分层图的正确作法
  • 板块P1717 钓鱼
  • 楼主hytree
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/11/15 20:25
  • 上次更新2023/11/5 07:58:30
查看原帖
分层图的正确作法
221002
hytree楼主2020/11/15 20:25

小蒟蒻看到这个题又想不出贪心又想不到DP,就只好写了个分层图最长路的做法了,提交不了题解,就在讨论里面分享吧QAQQAQ

#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;
}
2020/11/15 20:25
加载中...