日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HDU 5693 D Game 区间dp

發布時間:2025/6/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 5693 D Game 区间dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

D Game

題目連接:

http://acm.hdu.edu.cn/showproblem.php?pid=5693

Description

眾所周知,度度熊喜歡的字符只有兩個:B 和D。

今天,它發明了一個游戲:D游戲。

度度熊的英文并不是很高明,所以這里的D,沒什么高深的含義,只是代指等差數列(等差數列百科)中的公差D。

這個游戲是這樣的,首先度度熊擁有一個公差集合{D},然后它依次寫下N個數字排成一行。游戲規則很簡單:

  • 在當前剩下的有序數組中選擇X(X≥2) 個連續數字;

  • 檢查1選擇的X個數字是否構成等差數列,且公差 d∈{D};

  • 如果2滿足,可以在數組中刪除這X個數字;

  • 重復 1?3 步,直到無法刪除更多數字。

  • 度度熊最多能刪掉多少個數字,如果它足夠聰明的話?

    Input

    第一行一個整數T,表示T(1≤T≤100) 組數據。

    每組數據以兩個整數 N,M 開始 。接著的一行包括 N 個整數,表示排成一行的有序數組 Ai。接下來的一行是 M 個整數,即給定的公差集合 Di。

    1≤N,M≤300

    ?1 000 000 000≤Ai,Di≤1 000 000 000

    Output

    對于每組數據,輸出最多能刪掉的數字 。

    Sample Input

    3
    3 1
    1 2 3
    1
    3 2
    1 2 4
    1 2
    4 2
    1 3 4 3
    1 2

    Sample Output

    3
    2
    4

    Hint

    題意

    題解:

    區間dp

    由于等差數列的性質,只考慮刪除2個和刪除三個的情況

    如果要刪除的話,就必須把中間的都刪除,即dp[l+1,r-1]=(r-l-1)這種

    知道這個之后,我們直接暴力轉移就好了,復雜度n^3

    代碼

    #include <cstdio> #include <cstring> #include <iostream> #include <queue> using namespace std; const int maxn = 305; int c[maxn][maxn],a[maxn],dp[maxn][maxn],n,m,x; int vis[maxn][maxn]; void init() {memset(c,0,sizeof(c));memset(vis,0,sizeof(vis));memset(dp,0,sizeof(dp)); } void solvedp() {for(int len=1;len<=n;len++){for(int l=1;l<=n;l++){int r=l+len;if(r>n)break;dp[l][r]=max(dp[l+1][r],dp[l][r-1]);if(c[l][r]&&dp[l+1][r-1]==(r-l-1))dp[l][r]=max(dp[l][r],dp[l+1][r-1]+2);for(int i=l;i<r;i++)dp[l][r]=max(dp[l][r],dp[l][i]+dp[i+1][r]);for(int i=l+1;i<r;i++){if(c[l][i]&&dp[l+1][i-1]==(i-l-1))dp[l][r]=max(dp[l][r],dp[l+1][i-1]+dp[i+1][r]+2);if(c[i][r]&&dp[i+1][r-1]==(r-i-1))dp[l][r]=max(dp[l][r],dp[l][i-1]+dp[i+1][r-1]+2);if(c[l][i]&&c[i][r]&&a[i]-a[l]==a[r]-a[i]&&dp[l+1][i-1]==(i-l-1)&&dp[i+1][r-1]==(r-i-1))dp[l][r]=max(dp[l][r],r-l+1);}}} } void solve() {init();scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int tt=1;tt<=m;tt++){scanf("%d",&x);for(int i=1;i<=n;i++)for(int j=i+1;j<=n;j++)if(a[j]-a[i]==x)c[i][j]=1;}solvedp();printf("%d\n",dp[1][n]); } int main() {int t;scanf("%d",&t);while(t--)solve();return 0; }

    轉載于:https://www.cnblogs.com/qscqesze/p/5516294.html

    總結

    以上是生活随笔為你收集整理的HDU 5693 D Game 区间dp的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。