CF1209题解

E

每列都可以沿下滚动若干次,使得各行最大值之和最大

对每列的元素计算最大值,降序排,显然取前\(min(n,m)\)个列处理即可

比较巧妙的动规,设\(f(i,S)\)为前\(i\)列,已经确定最大值集合为\(S\)的其集合的最大值\((\)通俗讲,对于每列,二进制枚举该列设定为最大值的行位置,该行其他值便不需要管了\()\)

考虑类似于背包的转换,对于每个\(S\),填表法去填一个空位置,\(S\)从小到大枚举,即可

细节:滚动数组处理

#include
typedef int LL;
const LL maxn=13,maxm=2e3+9;
inline LL Read(){
    LL x(0),f(1); char c=getchar();
    while(c<'0' || c>'9'){
        if(c=='-') f=-1; c=getchar();
    }
    while(c>='0' && c<='9'){
        x=(x<<3)+(x<<1)+c-'0'; c=getchar();
    }return x*f;
}
struct node{
    LL x,id;
}M[maxm];
LL T;
LL a[maxn][maxm],f[1<yy.x;
}
inline LL Lowbit(LL x){
    return x&(-x);
}
inline void Solve(LL n,LL m){
    for(LL i=1;i<=m;++i) M[i]=(node){0,i},fg[i]=0;
    for(LL i=1;i<=n;++i){
        for(LL j=1;j<=m;++j){
            a[i][j]=Read();
            M[j].x=std::max(M[j].x,a[i][j]);
        }
    }
    for(LL i=0;i

F

路径拆成单字符,多层图跑最短路

转载于:https://www.cnblogs.com/y2823774827y/p/11545905.html

你可能感兴趣的:(CF1209题解)