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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

POJ 1745 Divisibility DP

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 POJ 1745 Divisibility DP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

POJ:http://poj.org/problem?id=1745

A完這題去買福鼎肉片,和舍友去買滴~舍友感慨“這一天可以賣好幾百份,每份就算賺一塊錢。。那么一個月。。一年。。。”?

我說“那我們以后去賣這個吧,餓了還能自己煮著吃”

哈哈,一群天真的少年呀~~~~

說正事~

------------------------------------------------華麗的分割線-------------------------------------------------

題目大意:

給一串數列,在其中間插入+或者-可以得到不同的結果,你需要判斷的是對于n個這樣的數經過一系列運算后最終是否能得到k。(每個數都要用,按題目給的順序)

思路:

DP,本題的精華在于用位向量來表示是否出現過mod k的余數,最后判斷0那個位置是否出現即可。

還可以直接用兩個一維數組來優化空間復雜度,不過時間略長一些。(世界是公平的,有舍才有得)

1.未優化空間復雜度 141ms

#include<cstdio> #include<cstring> const int MAXN=10000+10; bool dp[MAXN][110]; int main() {int n,k;while(~scanf("%d%d",&n,&k)){int temp;scanf("%d",&temp);memset(dp,0,sizeof(dp));dp[0][( temp +k*10000) %k]=1;for(int i=1;i<n;i++){scanf("%d",&temp);for(int j=0;j<k;j++){if(!dp[i-1][j])continue;dp[ i ][ (j + temp +k*10000) %k ]=1;dp[ i ][ (j - temp +k*10000) %k ]=1;}}if(dp[n-1][0])printf("Divisible\n");elseprintf("Not divisible\n");} }

2.優化了的版本 157MS

#include<cstdio> #include<cstring> bool dp[101]; int main() {int n,k;while(~scanf("%d%d",&n,&k)){int value;scanf("%d",&value);memset(dp,0,sizeof(dp));dp[( value +k*10000) %k]=1;for(int i=1;i<n;i++){bool temp[101]={0};scanf("%d",&value);for(int j=0;j<k;j++){if(!dp[j])continue;temp[ (j + value +k*10000) %k ]=1;temp[ (j - value +k*10000) %k ]=1;}memcpy(dp,temp,sizeof(temp));}if(dp[0])printf("Divisible\n");elseprintf("Not divisible\n");} }

轉載于:https://www.cnblogs.com/murmured/p/5004234.html

總結

以上是生活随笔為你收集整理的POJ 1745 Divisibility DP的全部內容,希望文章能夠幫你解決所遇到的問題。

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