HDU 4283 You Are the One(区间DP)
学习区间DP,积累经验ing
这次大框架挺熟悉了,代码打得也快了
但是还是在断点k上出了问题:
呃
pos(k,i,i+li-1) { f[i][i+li-1]=min(f[i][i+li-1],(a[i]*(k-i)+f[i+1][k]+f[k+1][i+li-1]+(k-i+1)*(b[i+li-1]-b[k]))); }
最后这个
f[k+1][i+li-1];
这里会导致出现 前>后
因此初始化要记得
f[j][j-1]=0;
错误点就是这个,还是在断点上没考虑清楚
下面是题面和ac码
#include<bits/stdc++.h> #define ll long long #define pos(i, a, b) for (int i = (a); i <= (b); i++) #define neg(i, a, b) for (int i = (a); i >= (b); i--) const int Max=150; const int inf=0x7f7f7f; using namespace std; int n,t; int a[Max],b[Max]; int f[Max][Max]; int main() { freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); cin>>t; pos(e,1,t) { //memset(a,0,sizeof(a)); //memset(b,0,sizeof(b)); cin>>n; pos(u,1,n) { pos(y,1,n) f[u][y]=inf; } pos(j,1,n) { cin>>a[j]; b[j]=b[j-1]+a[j]; f[j-1][j]=a[j]; f[j][j-1]=0; f[j][j]=0; } pos(li,2,n) { pos(i,1,n-li+1) { pos(k,i,i+li-1) { f[i][i+li-1]=min(f[i][i+li-1],(a[i]*(k-i)+f[i+1][k]+f[k+1][i+li-1]+(k-i+1)*(b[i+li-1]-b[k]))); } } } printf("Case #%d: %d\n",e,f[1][n]); } return 0; }