题目地址:点击打开链接
思路:水题,第一次投TLE了,结果改了一下,也TLE了,结果是忘了加!=EOF了,看上面TLE的那个代码也忘加了,加上之后也过了,把2个都贴一下吧
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> using namespace std; int dp[25][510]; int main() { int n,m,k; int i,j,l,min1; while(scanf("%d%d",&n,&k) != EOF) { memset(dp,0,sizeof(dp)); for(i=1; i<=k; i++) { scanf("%d",&m); dp[1][m] = 1; } for(i=2; i<=n; i++) { for(j=1; j<=k; j++) { scanf("%d",&m); min1 = INT_MAX; for(l=1; l<=500; l++) { if(dp[i-1][l] && dp[i-1][l] + abs(m-l) < min1) { min1 = dp[i-1][l] + abs(m-l); } } dp[i][m] = min1; } } min1 = INT_MAX; for(i=1; i<=500; i++) { if(dp[n][i] && dp[n][i] < min1) min1 = dp[n][i]; } printf("%d\n",min1-1); } return 0; }
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <queue> #include <stack> #include <map> #include <cstring> #include <climits> #include <cmath> using namespace std; int dp[25][15],a[25][15]; int main() { int n,m,k; int i,j,l,min1; while(scanf("%d%d",&n,&k) != EOF) { memset(dp,0,sizeof(dp)); for(i=1; i<=k; i++) { scanf("%d",&m); a[1][i] = m; } for(i=2; i<=n; i++) { for(j=1; j<=k; j++) { scanf("%d",&m); a[i][j] = m; min1 = INT_MAX; for(l=1; l<=k; l++) { if(dp[i-1][l] + abs(m-a[i-1][l]) < min1) { min1 = dp[i-1][l] + abs(m-a[i-1][l]); } } dp[i][j] = min1; } } min1 = INT_MAX; for(i=1; i<=k; i++) { if(dp[n][i] < min1) min1 = dp[n][i]; } printf("%d\n",min1); } return 0; }