内容敏感图像压缩
內容敏感圖像壓縮
Background
在清華大學存活,你需要有極強的文獻閱讀能力……【該背景與本題無關】
Description
有一張N*M的方格紙,每一個格子上寫了一個正整數,現在我們把方格紙首尾相連,組成一個高度為N,周長為M的圓柱體的側表面。
現在你需要找到一個從上到下貫穿該圓柱側表面的長度為N的路徑,使得路徑上的權值盡量小。其中,路徑上相鄰的兩點必須是“八連通的”。
Input? Format
第一行兩個整數N,M。接下來若干行是一個N* M的矩陣
Output? Format
一行一個整數,表示答案。
Sample? Input
3? 3
1??? 2? 2
2??? 2? 1
3??? 2? 1
Sample? Output
3
Constraint
·對于20%數據,min(N,M) = 1
·對于40%數據N,M <= 40
·對于約50%數據,路徑不經過圓柱體側表面。
·對于100%數據,N,M <= 3000
所以,這道題的名字有什么意義呢?可以考完試看一看題目后面附的文章。
?
錯誤代碼0分
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int n,i,j,k,m,a[3005][3005] = {30005},p,ans;
int main()
{
???????? freopen("compress.in","r",stdin);
???????? freopen("compress.out","w",stdout);
???????? scanf("%d %d",&n,&m);
???????? for(i = 1;i <= n;i++)
???????? {
?????????????????? for(j = 1;j <= m;j++)
?????????????????? {
??????????????????????????? scanf("%d",&a[i][j]);
?????????????????? }
???????? }
???????? if(m != 1)
???????? {
?????????????????? for(i = n - 1;i >= 1;i--)
?????????????????? {
??????????????????????????? for(j = m;j >= 1;j--)
??????????????????????????? {
???????????????????????????????????? if(j == 1)
???????????????????????????????????? {
?????????????????????????????????????????????? p = min(a[i + 1][m] + a[i][j],a[i + 1][j] + a[i][j]);
?????????????????????????????????????????????? a[i][j] = min(a[i + 1][j + 1] + a[i][j],p);
???????????????????????????????????? }
???????????????????????????????????? else if(j == m)
???????????????????????????????????? {
?????????????????????????????????????????????? p = min(a[i + 1][1] + a[i][j],a[i + 1][j] + a[i][j]);
?????????????????????????????????????????????? a[i][j] = min(a[i + 1][j - 1] + a[i][j],p);
???????????????????????????????????? }
???????????????????????????????????? else
???????????????????????????????????? {
?????????????????????????????????????????????? p = min(a[i + 1][j - 1] + a[i][j],a[i + 1][j] + a[i][j]);
?????????????????????????????????????????????? a[i][j] = min(a[i + 1][j + 1] + a[i][j],p);
???????????????????????????????????? }
??????????????????????????? }
?????????????????? }
?????????????????? ans = a[1][1];
?????????????????? for(i = 2;i <= m;i++)
?????????????????? {???????
??????????????????????????? ans = min(a[1][i],ans);
?????????????????? }
???????? }
???????? else
???????? {
?????????????????? ans = 0;
?????????????????? for(i = 1;i <= n;i++)
?????????????????? {
??????????????????????????? ans = ans + a[i][1];
?????????????????? }
???????? }
???????? printf("%d",ans);
???????? return 0;
}
?
正確答案:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 3010
#define INF 0x3f3f3f3f
int dp[MAXN][MAXN*2];
int mat[MAXN][MAXN*2];
?
int nextInt() {
???????? int ans=0;
???????? char c = 0;
???????? while (c=getchar(),c<'0'||c>'9');
???????? while (ans = ans*10+c-'0',c=getchar(),c>='0' && c<='9');
???????? return ans;
}//快速讀入
?
int main() {
//????? freopen("compress.in","r",stdin);
//????? freopen("compress.out","w",stdout);
???????? int n,m;
???????? scanf("%d%d",&n,&m);
???????? memset(mat,0x3f,sizeof(mat));//把每一個點都變成最大值
???????? memset(dp,0x3f,sizeof(dp)); //把每個路徑都變成最大值
???????? for (int i=1;i<=n;i++)
?????????????????? for (int j=1;j<=m;j++)
?????????????????? {
??????????????????????????? int x;
??????????????????????????? x = nextInt();
??????????????????????????? //scanf("%d",&x);
??????????????????????????? mat[i][j] = mat[i][j+m] = x;//分環成列在復制一個放在右面
?????????????????? }
???????? for (int j=1;j<=m;j++)
?????????????????? dp[0][j] = 0;//假設最上面有一層為0的
???????? for (int i=1;i<=n;i++)
?????????????????? for (int j=1;j<=m*2;j++)
??????????????????????????? dp[i][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i-1][j+1])) + mat[i][j];//枚舉每一個點他只有三種可能來的方向取最小值
???????? int ans = INF;
???????? for (int j=1;j<=m*2;j++)
?????????????????? ans = min(ans,dp[n][j]);//把最后一行所有的盡可能的最小值再比較得出最最小的值
???????? printf("%d\n",ans);//輸出答案
???????? return 0;
}
?
****其實這道題我應該只是錯在了沒有化環為列。
內容敏感圖像壓縮
給你一個矩陣讓你找到一個路徑dp方程組寫對了
常數優化,開o2
這道題如果說是一個環的話怎么辦
就是今天上午講的化環為列
完完整整復制一遍在棋盤上跑就行
就是一個過兩邊的復制問題
轉載于:https://www.cnblogs.com/rax-/p/9314749.html
總結
- 上一篇: Java BigDecimal初探
- 下一篇: 圆周率前100位记忆(房屋地点桩法)