Cod sursa(job #2730389)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 26 martie 2021 10:58:11
Problema Distincte Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <fstream>
#define MIN(a, b) (((a)>(b))?(b):(a))

const int N = 805;
const int K = 2005;
const int inf = 2e9;

int aib[N][K];
int v[N][N], dp[N][N];

void update(int k, int poz, int val) {
	for(;poz<N;poz+=poz&(-poz)) aib[poz][k] = MIN(aib[poz][k], val);
}

int query(int k, int poz) {
	int mn = inf;
	for(;poz;poz-=poz&(-poz)) mn = MIN(aib[poz][k], mn);
	return mn;
}

int main() {
	std::ifstream fin("distractie.in");
	std::ofstream fout("distractie.out");
	int n, m;
	fin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			fin>>v[i][j];
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++) dp[i][j] = inf;
		for(int j=0;j<K;j++) aib[i][j] = inf;
	}
	dp[1][1] = 0, update(v[1][1], 1, 0);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++) if(!(i==1 and j==1)) {
			dp[i][j] = MIN(dp[i][j], dp[i-1][j] + (v[i][j]!=v[i-1][j]));
			dp[i][j] = MIN(dp[i][j], dp[i][j-1] + (v[i][j]!=v[i][j-1]));
			dp[i][j] = MIN(dp[i][j], query(v[i][j], j) + i - 1 + j - 1 -1);
			update(v[i][j], j, dp[i][j] - (i - 1) - (j - 1));
		}
	fout<<dp[n][m];
}