답안 #235772

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
235772 2020-05-29T19:37:46 Z Pbezz 건포도 (IOI09_raisins) C++14
10 / 100
917 ms 35200 KB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 100000000000
#define MAXN 55
typedef pair<ll int,ll int> pii; 

ll int dp[52][52][52][52];//mapi[i][j][ii][jj] é answer para a submatriz 
ll int presum[MAXN][MAXN];
ll int arr[MAXN][MAXN];

ll int k;

void aa(){

ll int i,j,ii,jj;

	for(i=0;i<50;i++){
	for(j=0;j<50;j++){
		for(ii=0;ii<=i;ii++){
		for(jj=0;jj<=j;jj++){
		dp[i][j][ii][jj]=INF;
	}
	}
}
}

}

ll int getsum(ll int i,ll int j, ll int ii, ll int jj){

	ll int ans=presum[i][j];

	if(jj==0&&ii==0)return ans;

	if(ii==0){
	ans-=presum[i][jj-1];
	return ans;
	}

	if(jj==0){
	ans-=presum[ii-1][j];
	return ans;
	}

	ans-=presum[i][jj-1]; 
	ans-=presum[j][ii-1];
	ans+=presum[ii-1][jj-1];
	return ans;

}

ll int build(ll int i,ll int j,ll int ii,ll int jj){

	if(i==ii&&j==jj){

	dp[i][j][i][j]=0;
	return 0;
}
	if(dp[i][j][ii][jj]!=INF)return dp[i][j][ii][jj];

/*
	if(j==jj&&i==ii+1){

	dp[i][j][ii][jj] = arr[i][j]+arr[ii][j];
	return 0;

	}

	if(i==ii&&j==jj+1){

	dp[i][j][ii][jj] = arr[i][j]+arr[i][jj];
	return 0;

	}



	if(i==ii+1&&j==jj+1){

	dp[i][j][ii][jj] = arr[i][j]+arr[ii][jj]+arr[ii][j]+arr[i][jj];
	dp[i][j][ii][jj]*=2;
	return 0;

	}*/

	ll int nii,njj,sum,ans=INF;

		sum=getsum(i,j,ii,jj);

		for(njj=j-1;njj>=jj;njj--){
		ans=min(ans, build(i,j,ii,njj+1) + build(i,njj,ii,jj) );
		}
		//fazer o mesmo na horizontal
		for(nii=i-1;nii>=ii;nii--){
		ans=min(ans, build( i,j,nii+1,jj ) + build(nii,j,ii,jj) );
		}

		dp[i][j][ii][jj]=min(dp[i][j][ii][jj], ans+sum);

return dp[i][j][ii][jj];
}



int main(){

ll int n,m,i,j,ans;
	scanf("%lld %lld", &n, &m);



	for(i=0;i<n;i++){
		for(j=0;j<m;j++){ 

		scanf("%lld", &arr[i][j]);
		if(i==0&&j==0){presum[i][j]=arr[0][0]; continue;}

		if(i==0){
		presum[i][j]=presum[i][j-1]+arr[i][j];
		}else if(j==0){
		presum[i][j]=presum[i-1][j]+arr[i][j];
		}else{
		presum[i][j]=presum[i-1][j]+presum[i][j-1]-presum[i-1][j-1]+arr[i][j];
		}

		}
	}

	aa();

	ans=build(n-1,m-1,0,0);
/*
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
		cout<<dp[i][j][0][0]<<" ";
	}cout<<endl;
}cout<<endl;*/
	cout<<ans<<'\n';

  
return 0; 
} 

Compilation message

raisins.cpp: In function 'int main()':
raisins.cpp:109:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld %lld", &n, &m);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~
raisins.cpp:116:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld", &arr[i][j]);
   ~~~~~^~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 35072 KB Output is correct
2 Correct 19 ms 35072 KB Output is correct
3 Incorrect 20 ms 35072 KB Output isn't correct
4 Incorrect 19 ms 35072 KB Output isn't correct
5 Incorrect 19 ms 35072 KB Output isn't correct
6 Incorrect 19 ms 35072 KB Output isn't correct
7 Incorrect 19 ms 35072 KB Output isn't correct
8 Incorrect 26 ms 35072 KB Output isn't correct
9 Incorrect 33 ms 35072 KB Output isn't correct
10 Incorrect 39 ms 35072 KB Output isn't correct
11 Incorrect 35 ms 35200 KB Output isn't correct
12 Incorrect 80 ms 35072 KB Output isn't correct
13 Incorrect 139 ms 35072 KB Output isn't correct
14 Incorrect 47 ms 35072 KB Output isn't correct
15 Incorrect 159 ms 35072 KB Output isn't correct
16 Incorrect 29 ms 35072 KB Output isn't correct
17 Incorrect 69 ms 35072 KB Output isn't correct
18 Incorrect 436 ms 35160 KB Output isn't correct
19 Incorrect 768 ms 35196 KB Output isn't correct
20 Incorrect 917 ms 35192 KB Output isn't correct