2 条题解

  • 0
    @ 2022-10-4 11:24:53
    /*
    NOTE:状态转移
    首先,我们需要确定的是所求答案所在的状态。
    对于所到达的每一个格子,要么从左边的某一个格子跳过来,要么从右边的某一个格子跳过来。
    按这种划分方式将所有方案划分成各个集合。我们可以用 f[i][j] 来表示每一个集合。
    f[i][j] 表示从第 j 个格子跳到第 i 个格子的最小花费。
    */
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <iomanip>
    #include <cmath>
    #include <queue>
    #include <map>
    #include <stack>
    #include <vector>
    #include <fstream>
    using namespace std;
    const int N = 1e6+6;
    const int INF = 0x3f3f3f3f;
    int n;
    int a[1005],f[1005][1005];
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	memset(f,0x3f,sizeof(f));
    	f[2][1]=a[2];
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=n;j++){
    			if(j-i>=1) f[j][i]=min(f[j][i],f[j-i][i-1]+a[j]);
    		}
    		for(int j=n;j>=1;j--){
    			if(i+j<=n) f[j][i]=min(f[j][i],f[j+i][i]+a[j]);
    		}
    	}
    	int ans=0x3f3f3f3f;
    	for(int i=1;i<=n;i++)
    		ans=min(ans,f[n][i]);
    	cout<<ans;
    	return 0;
    }
    

    信息

    ID
    2843
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    32
    已通过
    11
    上传者