区间dp
的入门题
dpi,j 为 [i,j] 区间中的最小得分
区间dp一般是对于每个区间 [i,j] 枚举一个 k 将区间 [i,j] 切为两端并计算总区间代价
得出转移方程: dpi,j=min{dpi,k+dpk+1,j+l=i∑jarrl}
代码中需要使用前缀和预处理掉方程中的那个 l 省去一个 n 的时间复杂度
最终复杂度 O(n3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <iostream> #include <cstring> using namespace std; int n,arr[110],psum[110],dp[110][110]; int main(){ memset(dp,0x3f,sizeof(dp)); cin >> n; for(int i=1;i<=n;i++) cin >> arr[i],psum[i] = psum[i-1] + arr[i],dp[i][i] = 0; for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) for(int k=i;k<j;k++) dp[i][j] = min(dp[i][j],dp[i][k]+dp[k+1][j]+psum[j]-psum[i-1]); cout << dp[1][n] << endl; return 0; }
|