动态规划 循环展开--bzoj2431

qwq
从qz的博客看到了这道题
觉得很好
见识了一个新东西叫做 循环展开
百度百科这样定义:
循环展开,是一种牺牲程序的尺寸来加快程序的执行速度的优化方法。可以由程序员完成,也可由编译器自动优化完成。循环展开通过将循环体代码复制多次实现。循环展开能够增大指令调度的空间,减少循环分支指令的开销。循环展开可以更好地实现数据预取技术。

思路并不难
二维dp
状态是到第i个数有j个逆序对的方案数
然后枚举前面的

贴代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 1005
using namespace std;
int n,k,f[maxn][maxn]={1};

int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        for(int j=0;j<=k;j++){
            int l;
            for(l=0;l<i-8;l+=8){
                if(j<l) continue;
                f[i][j]+=f[i-1][j-l];
                if(j<l+1) continue;
                f[i][j]+=f[i-1][j-l-1];
                if(j<l+2) continue;
                f[i][j]+=f[i-1][j-l-2];
                if(j<l+3) continue;
                f[i][j]+=f[i-1][j-l-3];
                if(j<l+4) continue;
                f[i][j]+=f[i-1][j-l-4];
                if(j<l+5) continue;
                f[i][j]+=f[i-1][j-l-5];
                if(j<l+6) continue;
                f[i][j]+=f[i-1][j-l-6];
                if(j<l+7) continue;
                f[i][j]+=f[i-1][j-l-7];
            }
            for(l;l<i;l++){
                if(j<l) continue;
                f[i][j]+=f[i-1][j-l];
            }
            f[i][j]%=10000;
        }
    printf("%d",f[n][k]);
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值