時間限制:c/c++ 1秒,其他語言2秒
空間限制:c/c++ 32768k,其他語言65536k
64bit io format: %lld
rabbit大學畢業後找到了乙份實習工作,如果實習通過她就轉正了。
實習期共有n天,其中有幾天公司集體放假,rabbit不用上班,剩下時間她可以選擇工作或者休息。rabbit工作總是越來越累,可是每當她休息時,她就重新充滿了能量。簡而言之,rabbit第一天工作時一天會消耗體力1,連續第二天工作時一天會消耗體力2,連續第三題工作時一天會消耗體力3,以此類推......每當她休息後,工作的第一天又會消耗體力1。
為了讓boss滿意,rabbit想工作盡量多的天數,但是懶惰的rabbit又想讓自己的總體力消耗不超過k。
第一行兩個整數n,k。第二行乙個長度為n的01字串。如果第i個字元為『1』,表示這一天rabbit可以選擇工作或者休息,否則這一天rabbit放假。
輸出rabbit最多能工作的天數。示例1
複製
4 2複製1011
2
第三天和第四天裡面休息一天即可,總體力消耗為2
1<=n<=400用了兩個二維陣列,dp[410][410],cost[410][410]。1<=k<=n∗(n+1)/2
dp[i][j]儲存的是 :從前i天中抉擇,且第i天處於連續工作中的第j天的情況下能取得的最大工作天數,比如dp[6][3]表示第4,5,6天是處於連續工作的,所以第6天是處於連續工作時間段的第3天,陣列表示成了dp[6][3],也就是說,dp[i][j]中的倒著數的連續j天是工作的,這是已知的,這段一共工作了j天,花費也是確定的 j*(j+1)/2,要讓dp[i][j]取得最優解,那就只有讓dp[i-j][0]取得最優解,即先確定前i-j天能取得的最優解,然後從第i-j+1天一直工作到第j天,這段dp[i][j]就都能取得最優解。dp[i][0]表示第i天是休息的,放假也算休息,在第i天休息的情況下,從前i天裡進行抉擇能取得的最大工作天數,這其實還是得從前1天,前2天,,,前i-1天中取最大值,所以dp[i][0]儲存的就是前i-1天裡進行選擇能取得的最大工作天數,這個值要從dp[1][0],dp[1][1],dp[2][0],dp[2][1],dp[2][2],....,,dp[i-1][0],dp[i-1][1],dp[i-1][2],..dp[i-1][i-1]中取最大的,但這個定義其實是遞迴的,dp[i-1][0]其實表示的就是前i-2天能取得的最優解了,所以dp[i][0]只需要從dp[i-1][0],dp[i-1][1],......dp[i-1][i-1]中選最大值,最後dp[n+1][0]就是前n天進行選擇能取得的最大值。
cost[i][j]對應的是dp[i][j]這種情況下一共花費了多少,比如dp[4][0]和cost[4][0]如果已知,下一步就可以去更新dp[5][1],cost[5][1],以及dp[6][2],cost[6][2],以此類推,比如從cost[4][0]更新cost[5][1]的時候,第4天是休息的,第五天是新的開始工作的第一天,花費是1,更新cost[6][2]的時候,第5天和第6天是新的開始工作的第1和第2天,花費了1和2,如果cost[4][0]加上這些花費超過了題目限制k,就不可取。就是說,cost陣列是考慮題目的限制k,從某個dp[i][0]開始,往後更新是有限度的,花費上限k算乙個,另外,當題目給的字串的第i+j位置是0時,這天強制休息,這時,從第i+1天開始連續工作到第i+j天時就必須中斷了。
**用ll是最近做題做的陣列什麼的沒改直接用了,這個題int就行了。
#include #define ll long long
#define inf 123412341
using namespace std;
ll dp[410][410];
ll cost[410][410];
char ss[410];
ll n,k;
int main()
jia++;
}for(ll i=1;i<=n+1;i++)
}//求dp[i][0],也就是求前i-1天能達到的最大工作天數
for(ll t=0;t<=i-1;t++)
else if(dp[i-1][t]==dp[i][0]&&cost[i-1][t]}
//dp[i][0]已經確定為最優解,用它更新後面更大的情況
ll jia=1;
while(ss[i+jia]!='0'&&i+jia<=n)
else if(dp[i+jia][jia]==dp[i][0]+jia)
}jia++;}}
}cout
}
牛客練習賽32 B題 Xor Path
給定一棵n個點的樹,每個點有權值 定義表示 到的最短路徑上,所有點的點權異或和。對於,求所有 的異或和。第一行乙個整數n。接下來n 1行,每行2個整數u,v,表示u,v之間有一條邊。第n 1行有n個整數,表示每個點的權值 輸出乙個整數,表示所有 的異或和,其中 示例1 複製4 1 21 3 1 41...
牛客練習賽4 B
思維題,把 i2 j2 ai2 aj2 絕對值符號去掉後,我們設i2 j2 ai2 aj2 j2 i2 aj2 ai2 j2 aj2 i2 ai2 或者 i2 j2 ai2 aj2 j2 i2 aj2 ai2 ai2 i2 aj2 j2 原式化簡後只有這兩種形式,那麼我們可以設定兩個陣列a n b ...
牛客練習賽69 B
題意 給定n nn個數,乙個x xx表示可以劃分成最多x xx個串,乙個y yy表示在乙個串中最多選擇y yy個數。最後求 i 1x j 1yv al i j sum x sum yval i,j i 1x j 1 y va l i,j v al i,j val i,j val i,j 為 將n n...