0w1

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;
}