您的位置:首页 > 其它

poj 1180 斜率优化DP

2014-03-22 20:40 399 查看
AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

int dp[11000];
int sumt[11000], sumf[11000];
int S, N;
int q[11000], head, last;

int main(){
while( scanf( "%d", &N ) != EOF ){
cin >> S;
for( int i = 1; i <= N; i++ ){
scanf( "%d%d", &sumt[i], &sumf[i] );
}
sumt[N+1] = sumf[N+1] = 0;
for( int i = N; i >= 1; i-- ){
sumt[i] += sumt[i+1];
sumf[i] += sumf[i+1];
}
dp[N+1] = 0;
q[0] = N + 1;
head = last = 0;
//	dp
= ( S + sumt
) * sumf
;
for( int i = N; i >= 1; i-- ){
while( head < last && ( dp[q[head+1]] - dp[q[head]] ) <= ( sumt[q[head+1]] - sumt[q[head]] ) * sumf[i] ){
head++;
}
dp[i] = dp[q[head]] + ( S + sumt[i] - sumt[q[head]] ) * sumf[i];
while( last > head ){
double temp1 = (double)( dp[i] - dp[q[last]] ) / (double)( sumt[i] - sumt[q[last]] );
double temp2 = (double)( dp[q[last]] - dp[q[last-1]] ) / (double)( sumt[q[last]] - sumt[q[last-1]] );
if( temp1 <= temp2 ){
last--;
}else{
break;
}
}
q[++last] = i;
}
cout << dp[1] << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: