poj 1180 斜率优化DP

来源:互联网 发布:淘宝客云建站怎么样 编辑:程序博客网 时间:2024/05/17 09:28

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[N] = ( S + sumt[N] ) * sumf[N];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;}


0 0
原创粉丝点击