日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

acdream 1222 Quantization Problem [dp]

發(fā)布時間:2025/3/20 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 acdream 1222 Quantization Problem [dp] 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

稱號:acdream 1222 Quantization Problem


題意:給出一個序列 a ,然后給出一個 n * m 的矩陣,讓你從這個矩陣中選出一個序列k,使得sum(abs(ki - ai))盡可能的小,首先第一個數(shù)僅僅能在矩陣的第一行選第 x 個。然后以后每一個在第 x%n 行選,依次選出最小就可以。

每一個點能夠選多次、


分析:這個題目難度在于題意,題意讀懂了就簡單了。

非常明顯的一個dp題目,我們定義狀態(tài):dp 【i】【j】 :選第 i 個數(shù) 在第 j 列的最小和

則轉(zhuǎn)移方程:dp 【i】【j】 =?dp [ i - 1 ] [ k ] ?+ ?abs ( a [ i ] - mp ?[ k % s ] [ j ] ?) ; ? k是枚舉的前一次在第k行選

然后用一個pre數(shù)組保存一下路徑就ok


AC代碼:

#include <cstdio> #include <cmath> #include <algorithm> #include <queue> #include <cstring> using namespace std; const int inf = 0x3f3f3f3f; const int N = 1200; const int M = 130; int dp[N][M]; int mp[M][M]; int pre[N][M]; int a[N]; int main() {//freopen("Input.txt","r",stdin);int n;int T;scanf("%d",&T);while(T--){scanf("%d",&n);for(int i=0; i<n; i++)scanf("%d",&a[i]);int s,c;scanf("%d%d",&s,&c);for(int i=0; i<s; i++){for(int j=0; j<c; j++)scanf("%d",&mp[i][j]);}memset(dp,inf,sizeof(dp));for(int i=0; i<c; i++){int ff = abs(a[0]-mp[0][i]);dp[0][i]=min(dp[0][i],ff);//printf("%d ",dp[0][i]);}memset(pre,0,sizeof(pre));for(int i=1; i<n; i++){for(int j=0; j<c; j++){for(int k=0; k<c; k++){int ff = dp[i-1][k] + abs(a[i]-mp[k%s][j]); //枚舉在全部行取。if(ff<dp[i][j]){dp[i][j]=ff;pre[i][j]=k;}}//printf("%d ",dp[i][j]);}//printf("\n");}int ans = inf, rec;for(int i = 0; i < c; i++){if(dp[n-1][i] < ans){ans = dp[n-1][i];rec = i;}}printf("%d\n", ans);vector<int> res;int i = n-1;while(i != -1){res.push_back(rec);rec = pre[i--][rec];}for(int i = res.size() - 1; 0 <= i; --i){printf("%d%c",res[i],i==0?

'\n':' '); } } return 0; }



版權(quán)聲明:本文博客原創(chuàng)文章。博客,未經(jīng)同意,不得轉(zhuǎn)載。

總結(jié)

以上是生活随笔為你收集整理的acdream 1222 Quantization Problem [dp]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。