2 条题解

  • 0
    @ 2022-10-4 11:39:44

    #include <bits/stdc++.h>

    using namespace std; const int N = 1e6+6; const int INF = 0x3f3f3f3f; int n; int a[1005],dp[1005][1005]; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; memset(dp,0x3f,sizeof(dp)); dp[2][1]=a[2]; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(j-i>=1) dp[j][i]=min(dp[j][i],dp[j-i][i-1]+a[j]); } for(int j=n;j>=1;j--){ if(i+j<=n) dp[j][i]=min(dp[j][i],dp[j+i][i]+a[j]); } } int minn=0x3f3f3f3f; for(int i=1;i<=n;i++) minn=min(minn,dp[n][i]); cout<<minn; return 0; }

    • 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;
      }
      
      • 1

      信息

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