POJ 3666 Making the Grade
传送门:http://poj.org/problem?id=3666
解题思路:
dp[i][j]:代表第i个数以j结尾所花的代价。。
那么dp[i][j]=fabs(a[i]-j)+min(dp[i-1][k])k<j;
实现代码:
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #include <cmath> 6 using namespace std; 7 8 const int MAXN=2005; 9 int dp[MAXN][MAXN]; 10 int d[MAXN],a[MAXN]; 11 12 /***********************************************************\ 13 dp[i][j]:代表第i个数以j结尾所花的代价。。 14 那么dp[i][j]=fabs(a[i]-j)+min(dp[i-1][k])k<j; 15 ***********************************************************/ 16 17 18 19 20 int main(){ 21 int n; 22 while(scanf("%d",&n)!=EOF){ 23 for(int i=1;i<=n;i++){ 24 scanf("%d",&a[i]); 25 d[i]=a[i]; 26 } 27 28 sort(d+1,d+n+1); 29 memset(dp,0,sizeof(dp)); 30 for(int i=1;i<=n;i++){ 31 int mm=dp[i-1][1]; 32 for(int j=1;j<=n;j++){ 33 mm=min(mm,dp[i-1][j]); 34 dp[i][j]=abs(a[i]-d[j])+mm; 35 } 36 } 37 38 int ans=dp[n][1]; 39 for(int i=1;i<=n;i++) 40 ans=min(ans,dp[n][i]); 41 cout<<ans<<endl; 42 } 43 return 0; 44 }
自己选的路,跪着也要把它走完------ACM坑