彩色石子
来源:互联网 发布:练字字帖软件 编辑:程序博客网 时间:2024/04/27 14:42
题目详情
有一行彩色的棋子,每个棋子的颜色是k种颜色之一。你不能改变棋子的顺序,但是可以移走一些棋子。问至少移走多少个石子,才能使得两个同色的石子之间没有其他颜色的棋子?
输入格式:
多组数据,每组数据两行,第一行是两个整数n和k, 1<=n<=100, 1<=k<=5
下一行是n个在[1..k]范围内的正整数,代表每个棋子的颜色。
输出格式:
每组测试数据输出一行包含一个整数,表示至少移走的石子数。
注:可以移走第2个第7个棋子。
答题说明
输入样例
10 3
2 1 2 2 1 1 3 1 3 3
输出样例:
2
#include<stdio.h> #include<iostream> #include<string.h> #include<string> #include<algorithm> #include<map> using namespace std; #define rep(i,s,t) for(int i=s;i<t;i++) #define repp(i,s,t) for(int i=s-1;i>=t;i--) #define clr(a) memset(a,0,sizeof(a)); int n,k; int dp[111][111],a[7],x[111],y[111]; inline int get(int *a,int *b,int l){ clr(dp); rep(i,1,l+1) rep(j,1,l+1){ if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } int ans=0; rep(i,0,l+1) rep(j,0,l+1) ans=max(ans,dp[i][j]); return l-ans; } int main(){ while(~scanf("%d%d",&n,&k)){ clr(a); rep(i,1,n+1){ scanf("%d",&x[i]),a[x[i]]++; } int c[6]; rep(i,0,k) c[i]=i+1; int ans=1100; do{ int cnt=1; rep(i,0,k){ rep(j,0,a[c[i]]){ y[cnt++]=c[i]; } } ans=min(ans,get(x,y,n)); }while(next_permutation(c,c+k)); printf("%d\n",ans); } return 0; }
0 0
- 彩色石子
- 彩色石子
- 彩色石子
- 动态规划 彩色石子
- [编程挑战]彩色石子,仅供参考
- CSDN 编程挑战 彩色石子
- 彩色石子 问题的C++解法
- CLUB编程挑战赛之 彩色石子
- 彩色的石子 题目和解法 (附源代码)
- 彩色石子-c#求解-英雄会在线编程题目
- CSDN编程挑战之彩色石子(使用暴力破解法)
- 对英雄会中彩色石子问题的思考
- 关于“战神杯”线上编程大赛彩色石子一题的思路与解法
- 石子-石子合并
- 石子问题
- 石子问题
- 石子合并
- 取石子
- 第一篇 微信商城 开发前的准备工作
- iOS真机调试那些事
- Windows 下实现gcc 命令行编译
- JavaScript学习笔记六:prototype的提出
- shell脚本登陆数据库
- 彩色石子
- android 创建通知栏Notification
- Notes for NSURLSession
- oracle exp imp
- Javascript学习笔记七——原型链的原理
- Linux笔记--1
- Java封装,继承和多态的思考
- 时间处理工具类&工作日处理类
- java字符串转换成字节流