1 条题解

  • 2
    @ 2022-10-11 15:21:38

    一道很裸的动态规划题。

    算法思路

    设状态 fif_i 表示前 ii 个异区间中,从第 1 个异区间到第 ii 个异区间最少需要消耗多少魂力。

    我们枚举上一步是在哪个区间即可转移:

    fi=min⁡fj+vi−jf_i=\min f_j+v_{i-j}

    计算一下时间复杂度,发现一共有 nn 个状态,每个状态转移的时间复杂度为 O(n)O(n) ,所以总时间复杂度为 O(n2)O(n^2) ,能通过本题。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    
    #define LL long long
    
    const LL N=3e3+10;
    
    LL n,v[N],f[N];
    
    int main(){
    	scanf("%lld",&n);
    	for(LL i=1;i<n;i++) scanf("%lld",&v[i]);
    	memset(f,0x3f,sizeof(f));
    	f[1]=0;
    	for(LL i=2;i<=n;i++)
    	{
    		for(LL j=1;j<i;j++)
    		{
    			f[i]=min(f[i],f[j]+v[i-j]);
    		}
    	}
    	printf("%lld",f[n]);
    }
    
    • 1

    信息

    ID
    1
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    4
    上传者