您的位置:首页 > 其它

CF 2B.The least round way

2013-10-21 15:27 323 查看
题目链接

很久以前就见过此题,以前看了题解,然后今天写了写,写的真搓。

#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <iostream>
using namespace std;
int dp2[1001][1001];
int dp5[1001][1001];
int p2[1001][1001];
int p5[1001][1001];
int p[1001][1001];
int que[5001];
int x,y,n,num = 0;
void f1()
{
int a,b;
a = b = n;
while(1)
{
if(a > 1&&dp2[a][b] == dp2[a-1][b] + p2[a][b])
{
que[num++] = 1;
a --;
}
else if(dp2[a][b] == dp2[a][b-1] + p2[a][b])
{
que[num++] = 2;
b --;
}
if(a == 1&&b == 1) break;
}

}
void f2()
{
int a,b;
a = b = n;
while(1)
{
if(a > 1&&dp5[a][b] == dp5[a-1][b] + p5[a][b])
{
que[num++] = 1;
a --;
}
else if(dp5[a][b] == dp5[a][b-1] + p5[a][b])
{
que[num++] = 2;
b --;
}
if(a == 1&&b == 1) break;
}
}
void f3()
{
int a,b;
a = b = n;
while(1)
{
if(a > x)
{
que[num++] = 1;
a --;
}
else if(b > y)
{
que[num++] = 2;
b --;
}
if(a == x&&b == y) break;
}
while(1)
{
if(a > 1)
{
que[num++] = 1;
a --;
}
else if(b > 1)
{
que[num++] = 2;
b --;
}
if(a == 1&&b == 1) break;
}
}
int main()
{
int i,j,temp,flag;
scanf("%d",&n);
flag = 0;
for(i = 1;i <= n;i ++)
{
for(j = 1;j <= n;j ++)
{
scanf("%d",&p[i][j]);
if(p[i][j] == 0)
{
flag = 1;
x = i;
y = j;
continue;
}
temp = p[i][j];
while(temp%2 == 0)
{
p2[i][j] ++;
temp /= 2;
}
while(temp%5 == 0)
{
p5[i][j] ++;
temp /= 5;
}
}
}
for(j = 1;j <= n;j ++)
{
dp2[1][j] = dp2[1][j-1] + p2[1][j];
dp5[1][j] = dp5[1][j-1] + p5[1][j];
}
for(i = 1;i <= n;i ++)
{
dp2[i][1] = dp2[i-1][1] + p2[i][1];
dp5[i][1] = dp5[i-1][1] + p5[i][1];
}
for(i = 2;i <= n;i ++)
{
for(j = 2;j <= n;j ++)
{
dp2[i][j] = min(dp2[i-1][j],dp2[i][j-1]) + p2[i][j];
dp5[i][j] = min(dp5[i-1][j],dp5[i][j-1]) + p5[i][j];
}
}
if(flag == 0)
{
printf("%d\n",min(dp2

,dp5

));
if(dp2

< dp5

)
f1();
else
f2();
}
else
{
printf("%d\n",min(1,min(dp2

,dp5

)));
if(min(dp2

,dp5

) >= 1)
f3();
else if(dp2

< dp5

)
f1();
else
f2();
}
for(i = num-1;i >= 0;i --)
{
if(que[i] == 1)
printf("D");
else
printf("R");
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: