XDU2019寒假集訓 week3 DP高階

2021-09-10 16:54:38 字數 2060 閱讀 1661

a:bzoj 1264:[ahoi2006]

題意:給兩個序列s1,s2,由n種元素構成,滿足每個序列裡各元素出現5次,求最長公共子串行 

思路:每個串中的元素都會重複五次,記錄a串中的位置,讀b串,因為已經知道兩個相等,然後比較a串前面最大的加1和這個位置的值,用樹狀陣列存一下區間最大值,樹狀陣列+最長公共子串行變體

#include#define maxn 100005

int n;

int f[maxn],pos[maxn/5][6];

int bit[maxn];

int max(int x,int y)

void init()

return ;

}int lowbit(int x)

int query(int x)

int updata(int x,int val)

int solve()

} return ans;

}int main()

b:hdu 6537

題意:給乙個由整數組成的序列,可以對區間[l,r]進行反轉(invert),利用反轉令區間的最長不降序子串行長度增大,求最後的序列長度和反轉的區間

思路:第乙個想的是先找公升序列,再找降序列,然後兩邊加一下,結果發現10^5

c:zoj3537

題意:給出一些點表示多邊形蛋糕的定點的位置(逆時針順序),切蛋糕時每次只能在頂點和頂點間切,每一次切蛋糕都有相應的代價( |xi + xj

| * |

yi+

yj| % p.

),給出代價的公式,問把蛋糕切成多個三角形的最小代價是多少。頂點數

<=300(最優三角剖分)

思路:判斷凸包+區間dp

#include#include#include#include#define ll long long

#define inf 2000000007

#define maxn 305

using namespace std;

struct note

;note poi[maxn],sta[maxn];

int ans[maxn][maxn];

int cost[maxn][maxn];

int n,top;

bool cmp(struct note a,struct note b)

}int geta(int i,int j)

void solve(int i)

max_q[tail_high++]=i;

while(tail_low>pre_low&&num[min_q[tail_low-1]]>x&&tail_low-1>=0)

min_q[tail_low++]=i;

if(i>=k)

tmp/=10;

}ans[i]+=ans[i-1];

}}int main()

}

u:

題意:求1~n之間有多少個數又含有13又能被13整除,(1<=n<=1e9)

思路:數字dp,具體程式注釋

#include#include#define maxn 20

int dp[maxn][maxn][10];

int maxx[maxn];

int geta(int len,int mod,int stu,bool lim)

if(!lim)//沒有超過的話,就將計數返還

dp[len][mod][stu]=cnt;

return cnt;

}int main()

printf("%d\n",geta(len,0,0,1));

}}

2021寒假集訓 WEEK1 1 25 1 31

標頭檔案 algorithm 用法 next permutation s,s n 時間複雜度o n 函式作用 求數列中第k小的數 標頭檔案 algorithm 用法 nth element start,start k 1,start n 第k小的數字就是 a k 1 第k大的數字 a 第k大就是第n...

2019SDUTACM寒假集訓感

寫在最前面 18級的第一批集訓選拔我是參加過的,然後進了504。然而,我在504呆的時間並不長,聽過幾節學長講的課,講的很好,能聽懂。考慮到會掛科的情況,以及集訓的勞苦打壓,我退出了集訓 一退就是後悔 退出集訓的我決定自己往下學。然而,能力不足乙個多星期才能磨下乙個專題 痛苦 磨完乙個難的專題,又來...

2019牛客寒假演算法基礎集訓營1C

給定乙個長度為n nn的序列,沒乙個值表示第i ii個星球的能量指數為p ip i pi 飛船當前耐力指數為第乙個星球的能量指數,當星球i ii能到達星球j jj當且僅當p i pj p i p j pi pj 假設當前飛船的耐久值為t tt,當飛船到達星球j jj時船的耐久值會變為t p jt o...