Pagini recente » Cod sursa (job #2861600) | Cod sursa (job #924822) | Cod sursa (job #108627) | Cod sursa (job #2584164) | Cod sursa (job #2730389)
#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];
}