CodeForces 18E Flag 2 dp

来源:互联网 发布:ufc史蒂芬汤普森数据 编辑:程序博客网 时间:2024/05/29 14:30

题目链接:点击打开链接

#include<stdio.h>#include<iostream>#include<string.h>#include<set>#include<vector>#include<map>#include<math.h>#include<queue>#include<string>#include<stdlib.h>#include<algorithm>using namespace std;#define N 505#define inf 1000000009#define siz 26char s[N][N];int n, m;int dp[N][siz][siz];int a_path[N][siz][siz], b_path[N][siz][siz];int cost(int x, int a, int b){a += 'a'; b += 'a';int ans = 0;for(int i = 0; i < n; i++)if(i&1)ans += (a!=s[x][i]);else ans += (b!=s[x][i]);return ans;}void put(int z, int x, int y){if(z)put(z-1, a_path[z][x][y], b_path[z][x][y]);for(int i = 0; i < n; i++)if(i&1)printf("%c",x+'a');else printf("%c",y+'a');puts("");}int main(){while(cin>>m>>n) {for(int i = 0; i < m; i++)scanf("%s",s[i]);for(int i = 0; i < siz; i++) {for(int j = 0; j < siz; j++)if(i==j)dp[0][i][j] = inf;else dp[0][i][j] = cost(0,i,j);}for(int i = 1; i < m; i++){for(int A = 0; A < siz; A++)for(int B = 0; B < siz; B++) {if(A == B)continue;int cur = cost(i, A, B);int mid, minn = inf, x = -1, y = -1;for(int a = 0; a < siz; a++)for(int b = 0; b < siz; b++){if(a == A || b == B || a==b)continue;if(minn > dp[i-1][a][b])minn = dp[i-1][a][b],x=a,y=b;}dp[i][A][B] = minn + cur;a_path[i][A][B] = x;b_path[i][A][B] = y;}}int minn = inf, x, y;for(int a = 0; a < siz; a++){for(int b = 0; b < siz; b++){if(a==b)continue;if(minn>dp[m-1][a][b])minn = dp[m-1][a][b], x = a, y = b;}}cout<<dp[m-1][x][y]<<endl;put(m-1,x,y);}return 0;}


0 0
原创粉丝点击