您的位置:首页 > 运维架构

TopCoder SRM 612 DIV1 250 EmoticonsDiv1

2014-03-19 20:56 453 查看
题意:

A打了一个笑脸表情,每次操作有以下三种:

1、复制当前全部表情

2、粘贴

3、删除一个表情

问要到达所需要的表情个数至少需要多少次

题解:

由于数不大,DP即可,dp[i][j]表示剪贴板里有i个表情,总共有j个表情的最小次数

import java.util.*;
import java.math.*;
import java.util.ArrayList;
class pair
{
public int a,b;
public pair(int _a,int _b){a=_a;b=_b;}
public pair(){}
}
public class EmoticonsDiv1
{
final int MAXN = 2010;
final int INF = 1000000007;
int [][]dp=new int[MAXN][MAXN];
public static void main(String []args)
{

}
void update(int a,int b,int i,Queue<pair> que)
{
if(b>=1&&b<MAXN&&dp[a][b]>i)
{
dp[a][b]=i;
que.offer(new pair(a,b));
}
}
public int printSmiles(int n)
{
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
dp[i][j]=INF;
dp[0][1]=0;
pair pa=new pair(0,1);
Queue<pair>	que=new LinkedList<pair>();
que.offer(pa);
for(int i=1;i<MAXN;++i)
{
int cnt=que.size();
while((cnt--)>0)
{
pa=que.poll();
if(pa.b==n)
return i-1;
update(pa.a, pa.a+pa.b, i, que);
update(pa.b, pa.b, i, que);
update(pa.a, pa.b-1, i, que);
}
}
return 0;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: