//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
http://poj.org/problem?id=3666
题意:给定一个序列,将其改成非递减序列,求最小的sum( abs(a[i]-b[i]) )
题解:
有一个结论是:b[i]一定是原序列中的某个数。
d[i][j]表示b[i]是原序列第j大的数。d[i][j]=min(d[i-1][k])(1<=k<=j)+abs(a[i]-b[j])
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
const int N=2005;
int a[N],b[N],d[N][N];
int main() {
int n;
while(~scanf("%d",&n)) {
for(int i=1;i<=n;++i) {
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
memset(d,0,sizeof(d));
for(int j=1;j<=n;++j) d[1][j]=abs(a[1]-b[j]);
for(int i=2;i<=n;++i) {
int tmp=d[i-1][1];
for(int j=1;j<=n;++j) {
tmp=min(tmp,d[i-1][j]);
d[i][j]=tmp+abs(a[i]-b[j]);
}
}
int ans=d[n][1];
for(int i=2;i<=n;++i) ans=min(ans,d[n][i]);
printf("%d\n",ans);
}
return 0;
}
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
713C Sonya and Problem Wihtout a Legend
题意:给定一个序列,将其改成递增序列,求最小的sum( abs(a[i]-b[i]) )
题解:令a[i]=a[i]-i+1。就变成上面那题了。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <cstdio>
#include <string>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define de(x) cout << #x << "=" << x << endl
const int N=3003;
ll a[N],b[N],d[N][N];
int main() {
int n;
while(~scanf("%d",&n)) {
for(int i=1;i<=n;++i) {
scanf("%I64d",&a[i]);
a[i]=a[i]-i+1;
b[i]=a[i];
}
sort(b+1,b+1+n);
for(int j=1;j<=n;++j) d[1][j]=abs(a[1]-b[j]);
for(int i=2;i<=n;++i) {
ll tmp=d[i-1][1];
for(int j=1;j<=n;++j) {
tmp=min(tmp,d[i-1][j]);
d[i][j]=tmp+abs(a[i]-b[j]);
}
}
ll ans=d[n][1];
for(int j=2;j<=n;++j) ans=min(ans,d[n][j]);
printf("%I64d\n",ans);
}
return 0;
}