1. 程式人生 > >陜西師範第七屆K題----動態規劃

陜西師範第七屆K題----動態規劃

表數 btn 結果 bits clipboard 套路 bold 求解 暴力

ps: 自己的方法絕對是弱爆了

肯定存在更優的方法

O(n^3)復雜度 暴力求解的。。

鏈接:https://www.nowcoder.com/acm/contest/121/K
來源:牛客網

柯怡最近開始沈迷賭博,比如跟別人賭這次陜西皇家女子學院舉辦的校賽裏面,AK人數的奇偶;

而這種賭博顯然柯怡穩賺不賠,因為她可以偷偷參加校賽,然後在最後一分鐘觀察AK的人數,如果她賭的是奇數而那時有偶數個人AK,她只要用這剩下的一分鐘自己AK一次就可以讓數量變回偶數了;

聰明的ddjing發現了老千柯怡的陰險套路,萬般無奈的柯怡只好更改賭博的套路,這次她覺得跟ddjing玩猜數字;

這個遊戲很簡單,規則是,柯怡和ddjing在遊戲開始前,先規定數字的範圍是1到n,而柯怡則從這n個數裏面選出一個x並默默記在心中,每次ddjing去猜一個數y,柯怡會告訴ddjing,他是猜大了(y>x)還是猜小了(y<x),亦或者是猜對了(y==x);

而賭註則是,每次ddjing去猜一個數y的時候,若他沒有猜中,那麽他就需要向柯怡贈送y套女裝(因為這是柯怡的最愛),如果他猜中了,那柯怡將會穿著小裙裙來到比賽現場給大家發氣球;

雖然柯怡允許每次遊戲的時候,ddjing可以猜任意次,直到猜中為止,但這顯然可以為柯怡提供出千的可能,比如說,柯怡心中所選之數是x­1,而ddjing第一次就猜中了,然後柯怡就會馬上變更她心中所選之數為x2,同時告訴ddjing他猜大了還是猜小了,但柯怡不會破壞遊戲規則(比如說ddjing猜了5,柯怡告訴ddjing猜大了,那新的數就不能是小於等於5的數);

雖然ddjing知道這個遊戲有很大的出千空間,但他知道,只要付出足夠多的女裝,就能穩定贏得最後的勝利;

但ddjing手頭比較緊,他想知道,對於猜測1~n的遊戲,在柯怡不斷出千的情況下,他最少要準備多少套女裝,才能保證一定能猜到最終結果;

輸入描述:

第一行一個整數T(T<=100),代表數據組數;
對於每組數據,只有一行整數n(n<=300),代表遊戲的數字範圍;

輸出描述:

對於每組數據,輸出一個整數,代表ddjing至少需要準備的女裝數目;

示例1

輸入

復制
3
1
2
3

輸出

復制
0
1
2

說明

當n=1時,ddjing只要猜1就能猜中,所以不用贈送女裝;
當n=2時,ddjing柯怡猜1,下一次就肯定能猜中,所以只需要贈送一件女裝就好;
當n=3時,ddjing只要猜2,下一次就肯定能猜中,只需要要贈送兩件女裝就好;
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=307;
 4 const int INF=0x3f3f3f3f;
 5 int dp[N][N];
 6 int main ()
 7 {
 8     for (int l=2;l<=305;l++)
 9         for (int i=1;i+l<=305;i++) {
10             int j=i+l-1;
11             dp[i][j]=INF;
12             for (int k=i;k<=j;k++) {
13                 int t1=0,t2=0;
14                 if (k!=i) t1=dp[i][k-1];
15                 if (k!=j) t2=dp[k+1][j];
16                 int tmp=max (t1,t2)+k;
17                 dp[i][j]=min (dp[i][j],tmp);
18             }
19         }
20    int T; scanf ("%d",&T);
21    while (T--) {
22         int n; scanf ("%d",&n);
23         printf("%d\n",dp[1][n]);
24    }
25    return 0;
26 }

陜西師範第七屆K題----動態規劃