ABC 4 D - マーブル ( DP )
D: マーブル - AtCoder Beginner Contest 004 | AtCoder
#include <bits/stdc++.h> using namespace std; const int MAXR = 300 + 2; const int MAXC = 300 + 2; const int MAXB = 300 + 2; const int INF = 0x3f3f3f3f; #define rep( i, a ) for(int i = 0; i < (int)( a ); ++i) void upmin(int &x, int v){ if( x > v ) x = v; } int r, g, b; int dp[ 2001 ][ 1001 ]; // now on i, have put j void solve(){ memset( dp, INF, sizeof(dp) ); rep( i, 2001 ) dp[ i ][ 0 ] = 0; for(int i = 1; i <= 2000; ++i) for(int j = 1; j <= r + g + b; ++j){ if( j > i ) break; int dis; if( j > r + g ) dis = abs( i - 1100 ); else if( j > r ) dis = abs( i - 1000 ); else dis = abs( i - 900 ); dp[ i ][ j ] = min( dp[ i - 1 ][ j ], dp[ i - 1 ][ j - 1 ] + dis ); } printf("%d\n", dp[ 2000 ][ r + g + b ]); } int main(){ scanf("%d%d%d", &r, &g, &b); solve(); return 0; }
どうしてこれが間違えるのかわからないOrz
/* input: 267 294 165 answer output: 88577 my output: 89221 */ #include <bits/stdc++.h> using namespace std; const int MAXRBG = 300 + 2; const int INF = 0x3f3f3f3f; #define rep( i, a ) for(int i = 0; i < (int)( a ); ++i) void upmin(int &x, int v){ if( x > v ) x = v; } int r, g, b; int dp[ 2001 ][ MAXRBG * 3 ]; // now on i, have put j void solve(){ memset( dp, INF, sizeof(dp) ); rep( i, 2001 ) dp[ i ][ 0 ] = 0; for(int i = 0; i < 2000; ++i) for(int j = 0; j < r + g + b; ++j){ if( j > i ) break; upmin( dp[ i + 1 ][ j ], dp[ i ][ j ] ); int dis; if( j > r + g ) dis = abs( i + 1 - 1100 ); else if( j > r ) dis = abs( i + 1 - 1000 ); else dis = abs( i + 1 - 900 ); upmin( dp[ i + 1 ][ j + 1 ], dp[ i ][ j ] + dis ); } printf("%d\n", dp[ 2000 ][ r + g + b ]); } int main(){ scanf("%d%d%d", &r, &g, &b); solve(); return 0; }