gym 100524 E. Ebola Virus
阿新 • • 發佈:2018-11-19
dp[ i ][ j ]狀態代表必須要從左走到右,再從右走到左,然後i——j所有村莊救完。
#include"bits/stdc++.h" using namespace std; typedef long long ll; const int MX = 3003; const ll INFLL = 0x3f3f3f3f3f3f3f3f; int n; ll dp[MX][MX],f[MX],s[MX]; ll a[MX]; int main() { #ifdef LOCAL freopen("input.txt","r",stdin); #else freopen("ebola.in","r",stdin); freopen("ebola.out","w",stdout); #endif // LOCAL while(~scanf("%d",&n) && n) { for(int i = 1; i <= n; i++) scanf("%d",&a[i]); s[n+1] = 0; for(int i = n; i >= 1; i--) s[i] = s[i+1]+a[i]; for(int j = 1; j <= n; j++) { dp[j][j] = s[j+1]; for(int i = j-1; i >= 1; i--) { dp[i][j] = dp[i+1][j] + s[i+1] + s[j+1] + min(s[i+1], (ll)s[j+1] + a[i]*(j-i)*3 ); } } for(int j = 1; j <= n; j++) { f[j] = INFLL; for(int i = 0; i < j; i++) { f[j] = min(f[j], f[i] + dp[i+1][j] + s[j+1]*(j-i)); } } printf("%lld\n",f[n]); } return 0; }