55555,当时在学校没法捉……
250
有n只兔子,其中k(k<=n)只说了话,说话的形式如:和我一样颜色的有A[i]只!
然后问,满足这些话的情况下,n最小能是多少。
就是A[i]一样的贪心组合在一起即可。
550
给定一个数组A[i](i=0~n-1),假设你操作的序列是B[i](i=0~m-1)。
初始时m=1,B[0]=0
然后有3种操作:
1、将某个B[i] +1
2、将某个B[i] -1
3、选一个i然后
for (int j=m;j>i;j–) B[j]=B[j-1];
m++;
然后问最少进行多少操作,B[i]能和A[i]一样。
只要注意到复制以后,i和后面就可以断绝联系,这个区间dp的形式还是很明显的,F[i,j,k]表示区间[i,j]由一个初始时B[i]=k的复制而成至少需要多少次操作,然后枚举复制的位置和复制的长度就可以转移了。O(n^5) TC服务器无压力T_T
还有一种神贪心:
int getMinimum(vector int ret=lines[0]+lines.size()-1; for (int i=1;i if (lines[i]>lines[i-1]) ret+=lines[i]-lines[i-1]; return ret; } 暂时只证明了他的充分性,必要性不会证T_T 1000 这个我觉得是我见过最简单的1000了啊啊啊T_T。 注意它可以交换相邻两个,那么你想想冒泡排序吧,于是所有的顺序都可以排出来了。所以用数量就可以描述一个点。 Tarjan缩环(注意缩完以后已经是拓扑序的了),然后dp求最长路就行了。每个点权就是k!/(pA! * pB! *pC! *pD!) pA表示’A’的数量……
Orz
ym~~