Rotate Columns (hard version)
原题地址
代码:
懒得翻译了,题目很好懂
刚看时没思路,但看了题解就感觉没啥意思了,一道标准的状压DP(还是自己太菜了)
代码来源
const int N=13;
const int M=2005;
int n,m,B[M],C[M],A[N][M];
int f[N+1][1<<N],g[N+1][1<<N];
bool cmp(int a,int b) {return B[a]>B[b];}//B[i]代表第i列的最大值
int main( )
{
int i,j,k,t,z,r,u,G,T=read( );
while(T--)
{
read(n);read(m);;
for(i=1;i<=m;i++) B[i]=0,C[i]=i;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
A[i][j]=read( ),B[j]=max(B[j],A[i][j]);
sort(C+1,C+m+1,cmp);
int S=(1<<n)-1,o=min(n,m);
for(i=1;i<=o;i++)
{
k=C[i];
for(j=0;j<=S;j++)
{
u=0;
for(t=0;t<n;t++)//t代表转几格
{
r=0;
for(z=1;z<=n;z++)//z遍历各个位置
{
G=((z-1)+t)%n+1;
if((1<<(G-1))&j) r+=A[z][k];
}
u=max(u,r);
}
g[i][j]=u;//g[i][j]代表第i列状态为j的最大值
}
}
for(i=1;i<=o;i++)
for(j=0;j<=S;j++)
for(f[i][j]=g[i][j],k=j;k;k=(k-1)&j)
//注意这层for循环,第一次见这个写法,目的是求出小于j且k&j!=0的数
f[i][j]=max(f[i][j],f[i-1][k]+g[i][j-k]);
//f[i][j]代表前i列状态为j时的最大值
printf("%d\n",f[o][S]);
}
return 0;
}
Large Triangle
原题地址
题目大意:给n(n<=2000)个点,问你是否存在一个三角形,面积为k,有则输出任意符合条件的三角形顶点
代码:
参考博客
和BZOJ 3707差不多,只不过原题是求最小三角形面积
BZOJ 3707题解
讲一下为什么可以以x作为排序依据
总结就是,想出这个优化的人tql
E. Divisor Paths
其实看了参考博客的分析后,感觉并不难想,但比赛时做完D还有半小时,结果一点思路也没有(也有当时想睡觉的原因)
纪念一下,时隔两个月,cf div2场再次A掉4题
虽然从去年这个时候开始,div2已经基本保证个人3题起步,但A掉D题还是非常难见的事,也有各种原因(想的太复杂,敲错了某个字母检查不出来),但根本原因还是菜。毕竟学校的紫名大佬也能场场A掉3题(div1)