Barn Repair

 这题乍看之下怎么像DP,于是用DP做了,有个陷阱,题目没说输入牛的编号是有序的,所以要排序。

设dp[i][j]为木板数为i的条件下前j头 牛所需最少的木板数,d[j]为第j头牛的编号。

由前后两头牛的关系可知

dp[i][j]=min{dp[i][j-1]+d[j]-d[j-1],dp[i-1][j-1]+1}

后来才知道这题的经典解法是贪心,囧,被我想复杂了。

#include<cstdio> #include<iostream> #include<algorithm> using namespace std; #define N 220 #define INF 1000000000 #define min(x,y) (x<y?x:y) int d[N]; int dp[55][N]; int main(){ freopen("barn1.in","r",stdin); freopen("barn1.out","w",stdout); int i,j,m,s,c; cin>>m>>s>>c; for(i=1;i<=c;i++)cin>>d[i]; sort(d+1,d+1+c); fill(dp[0],dp[0]+N,INF); for(i=0;i<=m;i++)dp[i][0]=0; for(i=1;i<=m;i++){ for(j=1;j<=c;j++){ dp[i][j]=min(dp[i][j-1]+d[j]-d[j-1],dp[i-1][j-1]+1); } } cout<<dp[m][c]<<endl; return 0; }


你可能感兴趣的:(Barn Repair)