思路: 区间dp,类似于石子合并的问题,每次枚举合并的点就好了
代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 ll dp[105][105],sum[105]; 6 7 int main(){ 8 int T; cin>>T; 9 while(T--){ 10 int n; cin>>n; 11 memset(dp,0,sizeof(dp)); 12 memset(sum,0,sizeof(sum)); 13 for(int i=1; i<=n; i++){ 14 int x; cin >> x; 15 sum[i] = sum[i-1]+x; 16 } 17 18 for(int ri=2; ri<=n; ri++){ 19 for(int le=ri-1; le>=1; le--){ 20 for(int j=le; j<=ri; j++){ // 每次枚举合并的点 21 ll t = ((sum[j]-sum[le-1])%100)*((sum[ri]-sum[j])%100); 22 if(dp[le][ri]==0) 23 dp[le][ri] = dp[le][j]+dp[j+1][ri]+t; 24 else 25 dp[le][ri] = min(dp[le][ri],dp[le][j]+dp[j+1][ri]+t); 26 } 27 } 28 } 29 cout << dp[1][n] << endl; 30 } 31 }