AOJ2199 Differential Pulse Code Modulation
問題リンク Differential Pulse Code Modulation
- 解法
DPです。
dp[i][x]: i番目の信号を数xで復号化したときの最小値
という表を作れば解けます。配列が2本あれば十分です。
- ソース
import java.util.Arrays; import java.util.Scanner; //Differential Pulse Code Modulation public class AOJ2199 { void run(){ Scanner sc = new Scanner(System.in); int INF = 255*255*20000; for(;;){ int n = sc.nextInt(), m = sc.nextInt(); if((n|m)==0)break; int[] x = new int[n], c = new int[m]; for(int i=0;i<m;i++)c[i]=sc.nextInt(); for(int i=0;i<n;i++)x[i]=sc.nextInt(); int[] dp = new int[256]; Arrays.fill(dp, INF); dp[128] = 0; for(int i=0;i<n;i++){ int[] next = new int[256]; Arrays.fill(next, INF); for(int y=0;y<256;y++){ if(dp[y]==INF)continue; for(int j=0;j<m;j++){ int nx = y+c[j]; if(nx<0)nx=0; if(255<nx)nx=255; int v = dp[y]+(x[i]-nx)*(x[i]-nx); next[nx] = Math.min(next[nx], v); } } dp = next; } int res = INF; for(int i=0;i<256;i++)res = Math.min(res, dp[i]); System.out.println(res); } } public static void main(String[] args) { new AOJ2199().run(); } }