转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove
第一次做TC,这么欢乐,第一次在DVI 2把3题都过了。
250PT:由于总高度最多才47*(47+47)。而且也只有两种颜色
枚举最下面的颜色,然后枚举,记录一下不同的高度即可。
500PT:div2的这题很简单,只有7个数,枚举所有排列,然后判断一下就行了,next_permutation一下就可以了。
div1也有类似的题目,有47个数,这样就不能枚举了,不过可以发现高度肯定是递减然后递增,不然如果有一个塔的高度比两侧的大,那么这个塔的高度就要记录两次,肯定不是最优的。
接下来还要按字典序,必然第一个是0,然后找出一个字典序最小的递减的,将剩下的数递增就可以了。
class TheBrickTowerMediumDivOne{
public:
vector <int> find(vector <int> heights){
vector<int>ans;
int n=heights.size();
bool flag[50]={0};
ans.push_back(0);
while(1){
int i=1;
for(;i<n;i++)
if(!flag[i]&&heights[i]<=heights[ans.back()])
break;
if(i==n) break;
ans.push_back(i);
flag[i]=true;
}
while(1){
int idx=-1;
for(int i=1;i<n;i++)
if(!flag[i]&&(idx==-1||heights[i]<heights[idx]))
idx=i;
if(idx==-1) break;
ans.push_back(idx);
flag[idx]=true;
}
return ans;
}
};
1000pt:同样在div2里的这题也比较简单,最多4种颜色,而且H和K的范围也不大。
很容易想到一个H*K*C^8的DP,勉强还是可以接受的。
dp[i][j][a][b][c][d],表示第i层,总共有j组相同颜色,第i层的4个颜色分别为a,b,c,d时的种数。
10层循环,不过当时怕TLE,我还是WS的把当颜色为4的部分打了表。
也可以状态压缩下,变成3维的。