首页 > 其他分享 >AcWing 297. 赤壁之战

AcWing 297. 赤壁之战

时间:2022-10-25 11:36:48浏览次数:58  
标签:const int cas 枚举 ans 赤壁之战 297 mod AcWing


题目链接:

很容易想到一个dp:表示长度为,以结尾的上升子序列的个数
转移的话就是从枚举一个表示长度,再从枚举一个,再从枚举一个
转移就是如果,表示可以接在后面,那么
复杂度,可以过这个
显然不是正解,那么我们需要优化掉一层枚举
对于最后一层从,其实就是对的一个求和,可以树状数组
所以说这是一个数据结构优化dp
不是正解:

#include <bits/stdc++.h>
#define

using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
int n, a[A], b[A], f[A][A], T, m;

int main(int argc, char const *argv[]) {
cin >> T;
for (int cas = 1; cas <= T; cas++) {
memset(f, 0, sizeof f);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b + 1;
for (int i = 1; i <= n; i++) f[1][i] = 1;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++)
for (int k = 1; k < j; k++)
if (a[k] < a[j]) f[i][j] = (f[i][j] + f[i - 1][k]) % mod;
}
int ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + f[m][i]) % mod;
printf("Case #%d: %d\n", cas, ans);
}
}

加了树状数组:

#include <bits/stdc++.h>
#define

using namespace std;
const int mod = 1e9 + 7;
int n, a[A], b[A], f[A][A], T, m, t[A];
int lowbit(int x) {return x & -x;}
void add(int x, int val) {while (x <= n) t[x] = (t[x] + val) % mod, x += lowbit(x);}
int ask(int x, int ans = 0) {
while (x) ans = (ans + t[x]) % mod, x -= lowbit(x);
return ans;
}

int main(int argc, char const *argv[]) {
cin >> T;
for (int cas = 1; cas <= T; cas++) {
memset(f, 0, sizeof f);
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
sort(b + 1, b + n + 1);
for (int i = 1; i <= n; i++) a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b + 1;
for (int i = 1; i <= n; i++) f[1][i] = 1;
for (int i = 1; i <= m; i++) {
memset(t, 0, sizeof t);
if (i == 1) add(1, 1);
for (int j = 1; j <= n; j++) f[i][j] = ask(a[j] - 1), add(a[j], f[i - 1][j]);
}
int ans = 0;
for (int i = 1; i <= n; i++) ans = (ans + f[m][i]) % mod;
printf("Case #%d: %d\n", cas, ans);
}
}


标签:const,int,cas,枚举,ans,赤壁之战,297,mod,AcWing
From: https://blog.51cto.com/lyle/5794327

相关文章

  • AcWing 296. 清理班次2
    题目链接:​​传送门​​洛谷上的​​P4644[USACO05DEC]CleaningShifts​​​之前没发题解太高兴了数据结构优化dp的例题表示处理到处的最小花费拿一个线段树维护最小值......
  • AcWing 281. 硬币
    题目链接:​​传送门​​只是询问一个可行性那么二进制拆分加一个bitset就行了#include<bits/stdc++.h>#defineusingnamespacestd;typedeflonglongll;intn,m,a[A],......
  • AcWing 1221 四平方和
    \(AcWing\)\(1221\).四平方和+自定义排序(重载<)+二分题目传送门一、题目大意四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多\(4\)个正整数的平方和......
  • AcWing80 骰子的点数(线性dp)
    #definepbpush_backclassSolution{public:vector<int>numberOfDice(intn){intf[15][100];//投i次,总和为j的投掷可能memset(f,0,sizeof(......
  • AcWing 895.最长上升子序列Ⅰ
    题目链接:http://www.acwing.com/problem/content/897/浅浅复习放AC代码1#include<bits/stdc++.h>2usingnamespacestd;34constintN=1010;5intn;......
  • AcWing 154.滑动窗口
    AcWing154.滑动窗口题目描述给定一个大小为n≤10^6的数组。有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口中看到k个数字。每次滑动窗口......
  • 2022下半年 Acwing 第二篇:归并模板
    归并其实和快排比较类似,所以模板的记忆也大差不差。不能省懒!voidmerge_sort(intq[],intl,intr){if(l>=r)return;intmid=l+r>>1;merge_s......
  • ACWing 可达性统计
    ACWing可达性统计bitset可以说是一个多位二进制数,每八位占用一个字节,因为支持基本的位运算,所以可用于状态压缩,n位bitset执行一次位运算的时间复杂度可视为n/32.bitset<......
  • acwing 分组背包问题
    题面有N组物品和一个容量是V的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是vij,价值是wij,其中i是组号,j是组内编号。求解将哪些物品......
  • acwing 混合背包问题
    题面有N种物品和一个容量是V的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用si次(多重背包);每种体积是v......