poj 3184 Finicky Grazers

http://poj.org/problem?id=3184

题意:移动奶牛的位置,使相邻两头奶牛的距离满足D或D+1,要注意第一头奶牛在第一个位置,最后一头在最后一个位置,求奶牛的移动步数;

思路:滚动数组来记录从第一头奶牛开始所在位置的最小移动步数;

代码:

View Code
#include <cstdio>

#include <algorithm>

#include <iostream>

#include <cstring>

using namespace std;

#define max 9999999

int a[10010] = {0};

int s[2][10010] = {0};//记录第几个x+1所需最小移动步数

int n = 0;

int l = 0;

int main()

{

   scanf("%d%d",&n,&l);

   for(int i = 1;i <= n; ++i)

   scanf("%d",&a[i]);

   if(n == 1)

   {

       printf("0\n");

       return 0;

   }

   int x = l/(n - 1);

   int y = l%(n - 1);

   for(int i = 0;i <= y; ++i)

   s[0][i] = s[1][i] = max;

   s[1][0] = a[1] - 0;

   for(int i = 2;i <= n; ++i)

   {

      for(int j = 0;j <= y; ++j)

      s[0][j] = max;

      for(int j = 0;j <= y&&j <= i; ++j)

      {

          if(j > 0)

          s[0][j] = s[1][j-1]+abs(a[i] -((x+1)*(j)+(x)*(i-j-1))); //距离为x+1时

          s[0][j] = min(s[0][j],s[1][j]+abs(a[i]-(x+1)*(j)-x*(i-j-1)));//距离为x时

      }

       for(int j = 0;j <= y; ++j)

       s[1][j] = s[0][j];

   }

   printf("%d\n",s[1][y]);

   return 0;

}

我是从http://hi.baidu.com/liveroom/blog/item/58c2427af1afd1e42f73b364.html 参考的;

你可能感兴趣的:(poj)