您的位置:首页 > 其它

【dp】Making the Grade POJ - 3666

2017-08-11 09:14 381 查看
Think:

1知识点:dp+sort()快速排序

2状态转移方程

dp[i][j]:i个数以b[j]作为第i个数的当前状态最优解;
dp[i][j] = abs(a[i]-b[j]) + min(dp[i-1][k]) 1<=k<=n;


3思考:可通过滚动数组优化

以下为Accepted代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

using namespace std;

const int inf = 0x3f3f3f3f;
const int N = 2014;

int a
, b
, dp

;
/*dp[i][j]:i个数以b[j]作为第i个数的当前最优解*/

void solve(int n);

int main(){
int n, i;
while(~scanf("%d", &n)){
for(i = 1; i <= n; i++){
scanf("%d", &a[i]);
b[i] = a[i];
}
solve(n);
}
return 0;
}
void solve(int n){
sort(b+1, b+1+n);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++){
int miv = dp[i-1][1];
for(int j = 1; j <= n; j++){
miv = min(miv, dp[i-1][j]);
dp[i][j] = miv + abs(a[i]-b[j]);
}
}
int ans = inf;
for(int i = 1; i <= n; i++)
ans = min(ans, dp
[i]);
printf("%d\n", ans);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp