2 solutions

  • 2
    @ 2024-4-10 22:30:10

    DP捏

    显然 到达任意的位置

    只有从左边和从上面掉下来两条路子

    不会真的有人傻到向左走吧

    由于彩虹猫没法腾空

    so 只有天花板和地板两条道路

    (温馨提示:那个图就是个坑

    image

    你要真看这个图,那大约你也看不到下面的 image


    读题是这道题最难的部分我说的

    真的很难绷 上下蹿需要的是高度差大小的能量

    向右跑不需要能量

    网格图的意思是:

    image

    横坐标或许不用管,但是纵坐标挺坑的 注意:它看的是网格线,不是方格子


    好的,知道了这些就足够码出一个dp了,只有两层还是线性的dp还要教吗?


    Code

    #include <iostream>
    using namespace std;
    const long long INF=1e17;
    long long n,t[100114],f[100114];
    long long dp[100114][3];
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		cin>>t[i];
    		dp[i][1]=INF;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		cin>>f[i];
    		dp[i][2]=INF;
    	}
    	dp[1][1]=0;
    	dp[1][2]=t[1]-f[1];
    	for(int i=2;i<=n;i++)
    	{
    		if(f[i]<=f[i-1])
    			dp[i][1]=dp[i-1][1];
    		if(t[i]>=t[i-1])
    			dp[i][2]=dp[i-1][2];
    		dp[i][1]=min(dp[i][1],dp[i][2]+t[i]-f[i]);
    		dp[i][2]=min(dp[i][2],dp[i][1]+t[i]-f[i]);
    		if(t[i-1]<=f[i] || f[i-1]>=t[i])
    			dp[i][1]=dp[i][2]=INF;//请注意这里的特判,会有彩虹猫被卡死的可能哦
    	}
    	if(dp[n][1]==INF)
    		cout<<"-1";
    	else
    		cout<<dp[n][1];
    	return 0;
    }
    

    Information

    ID
    254
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    4
    Tags
    (None)
    # Submissions
    26
    Accepted
    17
    Uploaded By